描述
现在我们有这样一个数链问题如下:
1.输入一个正整数 n;
2.输出 n;
3.如果 n=1 则结束;
4.如果 n 是奇数则 n 变为 3n+1,否则 n 变为 n/2;
5.转入第 2 步。
例如输入的正整数 n=22,应该会输出如下的数链: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测:对于任意一个正整数,经过上述算法最终都会得到 1。
对于给定的正整数 n,我们把得到的数链中数的个数称为 n 的链长,例如 22 的链长是 16。
对于给定的任意一对正整数 a 和 b,求出 a 与 b 之间的最长链长,当然这 个最长的链长是由 a 和 b 之间的一个正整数产生的,包括 a 和 b。
输入
【输入】 输入文件名为 chain.in。 输入共一行,两个用空格隔开的正整数 a,b(a<b)。
输出
【输出】 输出文件名为 chain.out。 输入供一行,一个数,a 与 b 之间的最长链长。
输入样例 1
1 10
输出样例 1
20
提示
【样例说明】 9 的链长是 20。
【数据范围】
对于 30%的数据: 1<i<j<1000;
对于 100%的数据:1<i<j<100000。
来源
2015NOIP山东省小学组
代码
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
long long int n,a,b,i,j,som=0,cnt=0,mx=0,x;
cin>>a>>b;
for(i=a;i<=b;i++){
x=i;
som=0;
while(x!=1){
if(x%2==0){
x/=2;
}else{
x=x*3+1;
}
som++;
}
if(som>mx){
mx=som;
}
}
cout<<mx+1;
return 0;
}