题意:
对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。经过若干次这样的变换,一定会使n变为1.例如,3--10--5--16--8--4--2--1.
输入n,输出变换的次数。n=10^9.
样例输入:
3
样例输出 :
7;
分析:此题较为简单,思路比较清戏。但提交后不会ac;
错误代码:
#include<stdio.h>
int main()
{
int n,m=0;
scanf("%d",&n);
while(n!=1&&n>0)
{
if(n&1)
n=3*n+1;
else
n=n>>1;
m++;
}
printf("%d",m);
return 0;
}
但是 当输入987654321时,结果是1,结果明显不对;
很明显,发生溢出;int的范围是2^31;
故应扩大n的范围
(__int64)正确代码:
#include<stdio.h>
int main()
{
__int64 n,m=0;
scanf("%I64d",&n);
while(n!=1&&n>0)
{
if(n&1)
n=3*n+1;
else
n=n>>1;
m++;
}
printf("%d",m);
return 0;
}