使用不同数据类型的运行时C++的差异

Difference in runtime C++ using different data types

本文关键字:运行时 C++ 数据类型      更新时间:2023-10-16

好的,所以我正在为学校做一个小项目,我在任何地方都找不到为什么当数字m越来越高时,代码中的这个小变化会很快完成。看看变量">k",我将其从int改为long。

我试图在Collatz序列中找到介于1到1000000 之间的最长序列

void lengstaRuna() {
cout << "Hæsta tala?:";
int m;
cin >> m;
int lengstaRuna = 0;
int talaLengstuRunu = 0;
int k;
for(int i = 2; i < m; i++) {
int lengd = 1;
k = i;
while(k != 1) {
if(k % 2 == 0) {
k = k/2;
} else {
k = k*3 +1;
}
lengd++;
}
if(lengd > lengstaRuna) {
lengstaRuna = lengd;
talaLengstuRunu = i;
}
}
cout << "Lengsta runa: " << lengstaRuna << endl;
cout << "Tala lengstu runu: " << talaLengstuRunu << endl;
}

void lengstaRuna() {
cout << "Hæsta tala?:";
int m;
cin >> m;
int lengstaRuna = 0;
int talaLengstuRunu = 0;
long k;
for(int i = 2; i < m; i++) {
int lengd = 1;
k = i;
while(k != 1) {
if(k % 2 == 0) {
k = k/2;
} else {
k = k*3 +1;
}
lengd++;
}
if(lengd > lengstaRuna) {
lengstaRuna = lengd;
talaLengstuRunu = i;
}
}
cout << "Lengsta runa: " << lengstaRuna << endl;
cout << "Tala lengstu runu: " << talaLengstuRunu << endl;
}

问题很简单:当输入m==1000000时,为什么它运行得这么快?

我看到这里发生了什么。基本上,在输入的某个值以上,int就会溢出,因为您正在执行k*3。

我修改了你的代码来检查这一点(见下文)。输入值在113000左右时,"k"必须保持的最大值为1570824735(接近INT_max 2147483647)。任何114000或以上的代码,"k"溢出,代码进入未知区域。当然,当你长时间使用时,这个问题不会发生。

./a.out 113000
j: 1570824735
Lengsta runa: 354
Tala lengstu runu: 106239
#include <iostream>
#include <string>
using namespace std;
void lengstaRuna(int m) {

int lengstaRuna = 0;
int talaLengstuRunu = 0;
int k;
long j = 0;
for(int i = 2; i < m; i++) {
int lengd = 1;
k = i;
while(k != 1) {
if(k % 2 == 0) {
k = k/2;
} else {
if (k*3 > j)
j = k*3;
k = k*3 +1;
}
lengd++;
}
if(lengd > lengstaRuna) {
lengstaRuna = lengd;
talaLengstuRunu = i;
}
}
cout << "j: " << j << endl;
cout << "Lengsta runa: " << lengstaRuna << endl;
cout << "Tala lengstu runu: " << talaLengstuRunu << endl;
}
int main (int ac, char** av) {
std::string::size_type sz; 
lengstaRuna(std::stoi(av[1]));
}