HDU 1032 The 3n + 1 problem

解题报告: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 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3235952.html