一个大于1的自然数n,若n为奇数,则变为3n+1,若为偶数,则除以二,最后总能得到2,求变换的次数。
初始代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int counter = 0;
int n;
cin >> n;
while( n > 1 )
{
if( n % 2 == 0 )
n /= 2;
else
n = 3 * n + 1;
counter++;
}
cout << counter;
return 0;
}
但是输入987654321的时候,输出为1.显然错误,因为发生了溢出问题。
我们考虑把n变为double或者long long
1. double型
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int counter = 0;
double n;
cin >> n;
while( n > 1 )
{
if( static_cast<int>(n) % 2 == 0)
n /= 2;
else
n = 3 * n + 1;
counter++;
}
cout << counter;
return 0;
}
2.long long 型
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int counter = 0;
long long n;
cin >> n;
while( n > 1 )
{
if( (n) % 2 == 0 )
n /= 2;
else
n = 3 * n + 1;
counter++;
}
cout << counter;
return 0;
}
这样就不会有溢出问题了~