题目描述
计算机科学中的问题通常被归类为属于某一类问题(例如,NP,不可解,递归)。在这个问题中,您将分析算法的属性,该算法的分类对于所有可能的输入都是未知的。
考虑下面的算法:
1.输入n
2.输出n
3.如果n = 1,则停止
4.如果n是奇数,则n=3n + 1
5.否则n=n / 2
6.返回第2步
给定输入22,将输出以下序列的数字22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
据推测,使用上述算法任何输入值将终止(当输出1时)。尽管算法简单,但是不知道这个猜想是否为真。
然而,已经验证了所有整数n,使得0 <n <1,000,000(并且实际上,比这更多的数目也成立)。
给定输入n,可以确定输出的数字的数量(包括1)。对于给定的n,这被称为n的周期长度。在上面的例子中,22的周期长度为16。
对于任何两个数字i和j,您将确定i和j之间的所有数字的最大循环长度。
输入
输入将由一系列整数对i和j组成,每行一对整数。所有整数将小于1,000,000和大于0。
你应该处理所有的整数对,并且对每个对确定i和j之间的所有整数的最大循环长度。
您可以假设没有操作溢出32位整数。
输出
对于每对输入整数i和j,应输出i,j和i和j之间的整数的最大循环长度。这三个数字应该由至少一个空格分隔,一行上的所有三个数字和每行输入的一行输出。整数i和j必须以与它们在输入中出现的顺序相同的顺序出现在输出中,并且后跟最大循环长度(在同一行上)。
样例输入
1 10
100 200
201 210
900 1000
样例输出
1 10 20
100 200 125
201 210 89
900 1000 174
#include "iostream" using namespace std; int main() { int m,n,max,tmp,cnt; while(cin >> m >> n) {max = 0; for(int i=(m>n? n:m);i<=(m>n? m:n);++i) { tmp = i; cnt = 1; while(tmp!=1) { if(tmp%2==0) tmp = tmp/2; else tmp = tmp*3 + 1; cnt++; } (max < cnt? max=cnt : max = max); } cout << m << " " << n << " " << max << endl; } }