题目:
猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变为n的一半。经过若干次这样的变化,一定会使n变成1。例如:3->10->5->16->8->4->2->1。
输入n,输出变化的次数。n<=10^9。
代码一(有bug版)
#include<stdio.h>
int main()
{
int n, count = 0;
scanf("%d", &n);
while (n > 1)
{
if (n % 2 == 1)
{
n = n * 3 + 1;
}
else
{
n /= 2;
}
count++;
}
printf("%d\n", count);
return 0;
}
以上代码的Bug:当输入“987654321”时,输出1。
原因:乘法溢出了。
代码二
#include<stdio.h>
int main()
{
int n2,count = 0;
scanf("%d", &n2);
long long n = n2;
while (n > 1)
{
if (n % 2 == 1)
{
n = n * 3 + 1;
}
else
{
n /= 2;
}
count++;
}
printf("%d\n", count);
return 0;
}
使用long long可以避免溢出。
long lon在Linux在输入输出格式符为%lld,但Windows平台中有时为%I64d。