首页 > 代码库 > 1293. 3n+1数链问题 2016 12 23
1293. 3n+1数链问题 2016 12 23
/*
1293. 3n+1数链问题
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况我们并不知道哪一类问题可以解决,那一类问题不可解决。现在我们就有这样一个问题,问题如下:
- 1. 输入一个正整数n;
- 2. 把n显示出来;
- 3. 如果n=1则结束;
- 4. 如果n是奇数则n变为3n+1,否则n变为n/2;
- 5. 转入第2步。
例如对于输入的正整数22,应该有如下数列被显示出来:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测:对于任意一个正整数,经过以上算法最终会推到1。尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机,我们验证了对于小于1,000,000的正整数都满足以上推断。
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16。
你的任务是编写一个程序,对于任意一对正整数i和j,给出i、j之间的最长链长,当然这个最长链长是由i、j之间的其中一个正整数产生的。我们这里的i、j之间即包括i也包括j。
Input
输入文件只有一行,即为正整数i和j,i和j之间以一个空格隔开。0 < i ≤ j < 10,000。
Output
文件只能有一行,即为i、j之间的最长链长。
Sample Input
1 10
Sample Output
20
Problem Source
ZSUACM Team Member */
//前面是题目的原题
/*起初一开始是没有用递归来实现,分析问题觉得比较简单,可以完成,都是后面发现超时非常严重*/
//起初的代码如下
/*
#include<iostream>
using namespace std;
int main(){
int i,j;
int max = 0;
cin>>i>>j;
for(int t=i;t<=j;t++){
int count = 0;
while(t!=1){
if(t%2==0){
t = t/2;
}
else{
t = 3*t +1;
}
count ++;
}
if(max < count +1) max = count+1;
}
} */
//发现上面的代码超时非常的恐怖,所以觉得递归式最好的办法,由于这个题目的步骤重复比较明显,每一步都是利用
//上一步的,所以递归感觉简单快速
//ac的码如下
#include<iostream>
using namespace std;
int count1(int t,int count){
if(t==1) return count;
else{
if(t%2==0) count1(t/2,count+1);
else count1(3*t+1,count+1);
}
}
int main(){
int i,j;
int max = 0;
cin>>i>>j;
for(int t=i;t<=j;t++){
int count = 0;
count = count1(t,count);
if(max < count+1) max = count +1;
}
cout<<max<<endl;
}
1293. 3n+1数链问题 2016 12 23