3n+1问题
对于任意大于1的自然数n,若该数为偶数则将其变为原来的一半,若为奇数则将其变为3n+1。反复进行上述过程,直到结果为1时停止。这就是著名的“3n+1”问题。要求输入n,输出按“3n+1”规则变换到1所需要的数字变换次数。(n<=10^9)
直观想法:
#incldue<stdio.h>
int mian()
{
int n,count=0;
scanf("%d",&n);
while(n>1)
{
if(n%2 == 1) n = n*3 + 1;//n为奇数
else n /= 2;//n为偶数
count++;
}
printf("%d\n",count);
return 0;
}
当输入为"987654321"时结果输出为1,这明显是错误的。
此处发生乘法溢出,int整数的大小为-2147483748 ~ 2147483647(2^31-1),int型变量一般是32位整数最高位用来表示符号,实际只有31位用来表示数值的大小。
此处避免为乘法的溢出,需要采取可以表示更大数值的数据类型,我们选择long long 型数据,对于long long型数据的输入需要把%d改成%lld,而在gcc中需要改成%I64d,十分复杂。
我们可以利用long long型变量作为中间变量使用,避免对其的直接输入,利用C语言自带的数据类型转换实现。
#incldue<stdio.h>
int mian()
{
int n1,count=0;
scanf("%d",&n1);
long long n = n1;
while(n>1)
{
if(n%2 == 1) n = n*3 + 1;//n为奇数
else n /= 2;//n为偶数
count++;
}
printf("%d\n",count);
return 0;
}
最后可以得到987654321输入的正确结果。