对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变为n的一半,经过若干次这样的变换,一定会使n变为1,输入n,输出变换的次数。n<=10^9 两个程序: #include<stdio.h> #include<math.h> int main() { double n,count=0; scanf("%lf",&n); while(n>1) { if((int)n%2==1) n=n*3+1; else n/=2; count++; } printf("%lf\n",count); return 0; } 第二个: #include<stdio.h> int main() { __int64 n,count=0; scanf("%lld",&n); while(n>1) { if(n%2==1)n=n*3+1; else n/=2; count++; } printf("%lld\n",count); return 0; } 这两个就是在999999989时以前都是一样的输出,但是一到999999990时第一个就无法实现,第二个就可以,我想是第一个程序溢出了,但是为什么分界线是999999989? 另int的范围是多少?书上是60000多,但是在C-free5.0里好像不止, 另if((int)n%2==1)这样的方法是不是可以的?我有时候可以运行,有时候又会报错?第一个是double类型的问题。
多次乘除以后 double会产生很小的小数。导致n始终大于1,然后死循环。
第一个你用 999999979也是死循环
int的范围 和机器有关
现在一般都是2的32次方了
C语言的int类型与开发环境平台有关,可能是16位(2^16),也可能是32位(2^32),估计现在大多数开发环境都是用32位的,所以范围远远超出65535,可达到4294967296,
if((int)n%2==1) 我觉得可以
类型转换优先级在%前 %的优先级在==号前。
是 先将n变int 在%2 在==
问:如果题目要求用double来做该怎么编程?回答:while(n>1) 改成 while(n>1.2) 这样的话 就差不多了。毕竟double的产生的小数很小很小。只要比1.2小,就可以当作是1了。
3n+1问题
最新推荐文章于 2021-11-13 11:48:08 发布