我在 collatz() 中添加了 elseif 语句来检查工作编号 * 3 + 1 是否会超过 INT_MAX,但在运行程序时,一些不应该超过 INT_MAX 的数字被报告为这样做。我可能不需要强制转换 INT_MAX,但我不确定。
#include <iostream>
#include <cstdlib>
#include <climits>
using namespace std;
void collatz( int startingnumber ) {
int count = 0;
int originalnumber = startingnumber;
int workingnumber = startingnumber;
while( workingnumber >= 1 ) {
if( workingnumber == 1 ) {
cout << originalnumber << " takes " << count << " steps" << endl;
count = 0;
break;
}
if( workingnumber % 2 == 0 ) {
workingnumber /= 2;
//optional
//cout << originalnumber << " is at " << workingnumber << endl;
count++;
}
else if( ( ( long int ) workingnumber * 3 ) + 1 > ( long int ) INT_MAX ) {
cout << originalnumber << " will cause a buffer overflow" << endl;
break;
}
else {
workingnumber = ( 3 * workingnumber ) + 1;
//optional
//cout << originalnumber << " is at " << workingnumber << endl;
count++;
}
}
}
int main( int argc, char* argv[] ) {
int increment = 2;
if( argc > 1 ) {
if( atoi( argv[1] ) != 0 ) {
increment = atoi( argv[1] );
}
}
while( increment <= INT_MAX ) {
collatz( increment );
increment++;
}
return 0;
}
最佳答案
当您需要对大数进行运算时,最好使用任意精度算术库,例如 GNU MPFR .
这样,您就不必担心整数溢出。
关于c++ - 检查计算是否会导致溢出c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265645/