解题报告:3n+1问题应该都知道,这里要求的是在一个区间i到j里面长度最大的那个数是的长度是多少?首先要说的 是这题不能打表,打表只能打到100000左右就不行了,然后我们可以先确定一下最大的长度大概有多少,大概就是300多的样子,还好,只有3位数,可以直接暴力都不会超时,这就简单了,一开始总是觉得应该要打表,要不然就会超时,但是 确定最大只有300多就好了。不过这题还要注意的是输入的范围 i 可能会大于 j ,这个好坑,然后输出还得按照原来的顺序输出。
1 #include<cstdio> 2 #include<iostream> 3 int main() { 4 int m,n; 5 while(scanf("%d%d",&m,&n)!=EOF) { 6 int ans = 0; 7 printf("%d %d ",m,n); 8 if(m > n) //真的有i > j 的情况,去掉这句就WA 9 std::swap(m,n); 10 for(int i = m;i<=n;++i) { 11 int d = 1,k = i; 12 while(k != 1) { 13 d++; 14 if(k & 1) 15 k = 3*k+1; 16 else k/=2; 17 } 18 if(d > ans) 19 ans = d; 20 } 21 printf("%d ",ans); 22 } 23 return 0; 24 }