3n+1数链问题

题目描述

在计算机科学上,有很多类似的问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。现在我们就有这样一个问题,问题如下:
(1)输入一个正整数n;
(2)把n显示出来;
(3)如果n=1则结束;
(4)如果n是奇数则n变为3*n+1,否则变为n/2;
(5)转入第(2)步。
例如对于输入的正整数22,应该有如下数列被显示出来:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测:对于任意一个正整数,经过以上算法最终会推到1。尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机,我们验证了对于小于1000000的正整数都满足以上推断。
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16。
你的任务是编写一个程序,对于任意一对正整数i和j,给出i与j之间的最大链长,当然这个最长链长是由i与j之间的其中一个正整数产生的。我们这里的i和j即包括i也包括j。

输入

输入两个正整数i、j,i和j之间以一个空格隔开。0 < i <= j < 10000。

输出

输出数据只有一行,即为i与j之间的最长链长。

示例输入

1 10

示例输出

20
 
  
  
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int n,m,j,i,l,max=0,count;  
  5.     long long k;  
  6.     scanf("%d %d",&n,&m);  
  7.     for(i=n;i<=m;i++)  
  8.     {  
  9.         count=0;  
  10.         k=i;  
  11.         while(k>1)  
  12.         {  
  13.            if(k%2==1) k=k*3+1;  
  14.            else k/=2;  
  15.            count++;  
  16.         }  
  17.         if(count>max) max=count;  
  18.     }  
  19.     printf("%d\n",max+1);  
  20. }  
  21.    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值