1.链接地址
https://vjudge.net/problem/POJ-1207
2.问题描述
Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.
Consider the following algorithm:
1. input n
2. print n
3. if n = 1 then STOP
4. if n is odd then n <-- 3n+1
5. else n <-- n/2
6. GOTO 2
Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)
Given an input n, it is possible to determine the number of numbers printed before the 1 is printed. For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.
For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.
输入样例
1 10 100 200 201 210 900 1000
输出样例
1 10 20 100 200 125 201 210 89 900 1000 174
3.解题思路
一开始想的就是暴力解,但是不知道有没有什么简便的方法,查了一下题解好像都是暴力,行吧。。。
4.算法实现源代码
#include <iostream> #include <cstdio> using namespace std; int count(int num) { int sum=1; while(1) { if(num==1) { return sum; } if(num%2!=0) { num=3*num+1;sum++; } if(num%2==0) { num=num/2;sum++; } } } int main() { int low,high,i; while(cin>>low>>high) { int m =low,n=high; if(low>high) { int temp = low; low = high; high = temp; } int max = count(low); for(i=low;i<=high;i++) { int num = count(i); if(num >max) max = num ; } cout<<m<<" "<<n<<" "<<max<<endl; } return 0; }