3n+1问题

对于任意大于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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值