您的位置:首页 > 编程语言 > C语言/C++

3n+1 C语言练习

2013-12-03 12:36 786 查看
在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可以解决。现在我们就有这样一个问题,问题如下:

(1)输入一个正整数n;

(2)把n显示出来;

(3)如果n=1则结束;

(4)如果n是奇数,则n变为3×n+1,否则n变为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.

输入

每个测试数据输入只有一行,包含2个正整数i和j(0 < i <= j < 10000).

输出

每个测试数据输出一行,即i与j之间的最长链长。

样例输入

1 10

样例输出

20

#include<stdio.h>
int main(){
int ma(int *count,int);
int a,b,i,j,count[10000],k,n,index=0;
scanf("%d %d",&i,&j);
for(a=i;a<=j;a++){
k=1;
n=a;
while(n!=1){
if(n%2==0){
n=n/2;
}
else {
n=3*n+1;
}
k++;
}
count[index++]=k;
}
printf("%d\n",ma(count,j-i+1));
return 0;

}
int ma(int *count,int n){
int i,ic=count[0];
for(i=0;i<n;i++){
ic=(ic>count[i]?ic:count[i]);
}
return ic;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: