3n+1数链问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
在计算机科学上,有很多类似的问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。现在我们就有这样一个问题,问题如下: (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
#includeint main(){ int a,b,i,j,t,mnum,num; scanf("%d %d",&a,&b); mnum=0;//mnum记录最长的链长 if(a>b) { t=a; a=b; b=t; } for(i=a; i<=b; i++) { num=0; j=i; while(j!=1) { if(j%2!=0) j=3*j+1; else j/=2; num++; } if(num>mnum) mnum=num; } printf("%d\n",mnum+1); return 0;}