在计算机科学上,有很多问题是无法解决的,我们称之为不可解问题。然而,在很多情况下我们并不知道哪一类问题可以解决哪一类问题不可解决。现在我们就有这样一个问题,问题如下:
(1)输入一个正整数n
(2)把n显示出来
(3)如果n=1则结束
(4)如果n是奇数则n变为3×n+1, 否则变为n/2
(5)转入第二步
例如输入的正整数为22,应该有如下的数列被显示出来:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测,对于任意一个正整数,经过以上算法最终会推到1。尽管这个算法很简单,但是我们仍然无法确定我们的推断是否正确。不过好在我们有计算机,我们验证了对于小于1000000的正整数都满足以上推断。
输入格式
输入数据有多组,最后以一行"0 0"结束。
输出格式
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16。
你的任务是编写一个程序,对于任意给定的一对正整数i和j,给出i和j之间的最长链长,当然这个最长链长是由i~j中的一个正整数产生的。我们这里的i和j之间即包括i也包括j。
样例输入
1 10 0 0
样例输出
20
#include<stdio.h>
int sumx(int a){
int i=1;
while(a!=1){
if(a%2==0)
a=a/2;
else
a=a*3+1;
i++;
}
return i;
}
int main(){
int a,b,i,j,max;
while(scanf("%d %d",&a,&b)!=EOF){
if(a==0&&b==0)
break;
int y=b-a+1;
int sum[y];
for(i=0;i<y;i++)
sum[i]=0;
i=0;
while(a<=b){
sum[i]=sumx(a);
a++;
i++;
}
max=sum[0];
for(i=0;i<y;i++){
if(sum[i]>max)
max=sum[i];
}
printf("%d\n",max);
}
return 0;
}