The 3n + 1 problem
洛谷UVA100 点击这里查看原题
题目背景
本题可能有超过题目范围的数据。
题目描述
输入格式
输出格式
题面翻译
考虑下面的程序:
-
输入 n n n
-
输出 n n n
-
如果 n = 1 n=1 n=1 退出程序
-
如果 n n n 是奇数, n → 3 n + 1 n \rightarrow 3 n + 1 n→3n+1
-
如果 n n n 是偶数 n → n 2 n\rightarrow \dfrac n 2 n→2n
-
回到第 2 2 2 步
若输入
22
22
22,会得出下面的数列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
。
我们推测,对于任何输入的正整数 n n n,程序最终都会输出 1 1 1( n ≤ 1 0 6 n\le 10^6 n≤106 时,保证推论正确)。 给定 n n n,可以计算这个程序输出的所有数字的数量(包括最后的 1 1 1)。我们把输出的数字总数称为这个 n n n 的周期长度。对于上面的例子,周期长度为 16 16 16。
对于输入的每对 ( i , j ) (i,j) (i,j),计算 [ i , j ] [i,j] [i,j] 内所有数字区间长度的最大值。
输入格式
输入几对整数 ( i , j ) (i,j) (i,j),保证 0 < i , j ≤ 1 0 4 0<i,j\le 10^4 0<i,j≤104。对于每对 ( i , j ) (i,j) (i,j),你需要计算 [ i , j ] [i,j] [i,j] 内最大区间长度。数据保证 32 32 32 位整数在计算过程中不溢出。
输出格式
对于每对 ( i , j ) (i,j) (i,j),先输出 i , j i,j i,j,再输出 [ i , j ] [i,j] [i,j] 范围内最大周期长度,每个数字中间一个空格,然后换行。
样例 #1
样例输入 #1
1 10
100 200
201 210
900 1000
样例输出 #1
1 10 20
100 200 125
201 210 89
900 1000 174
答案
#include<bits/stdc++.h>
using namespace std;
int main(){
int i,j,ans=1,cnt=1;
while(cin >> i >> j){
ans = 1;
cout << i << " " << j << " ";
if(i>j) swap(i,j);
for(int k=i;k<=j;k++){
int tmp=k;
cnt=1;
while(tmp!=1){
if(tmp%2==0){
tmp /= 2;
cnt++;
}
else{
tmp = tmp*3+1,
cnt++;
}
}
ans=max(ans,cnt);
}
cout << ans << endl;
}
return 0;
}