题目描述:
考虑以下生成数字序列的算法。
从整数n开始。如果n是偶数,除以2。
如果n是奇数,乘以3,再加上1。
用n的新值重复这个过程,当n=1时终止。
例如,对于n=22将产生以下数列:22:11 34 17 52 26 13 40 10 5 16 8 4 2 1。
我们猜测(但尚未证明),对于每一个整数n,这个算法将以n=1结束。
但是,对于所有整数,这个猜想至少可以维持到1,000,000。
对于输入n,n的循环长度是在1之前生成并包含1的数。
在上面的例子中,22的循环长度是16。
给定任意两个数字i和j,就可以确定i和j之间所有数的最大循环长度,包括两个端点。
输入:
输入将由一系列整数i和j组成,每一行一个整数对。所有整数将小于1,000,000和大于0。
输出:
对于每一对输入整数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
参考解答:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String[] str_array = (sc.nextLine()).split(" ");
System.out.println(str_array[0] + ' '
+ str_array[1] + ' '
+ count(Integer.parseInt(str_array[0]), Integer.parseInt(str_array[1])));
}
}
private static int count(int num_left, int num_right) {
int max = 1;
int left = Math.min(num_left, num_right);
int right = Math.max(num_left, num_right);
for (int i = left; i <= right; i++) {
int sum = 1, num = i;
while (num != 1) {
sum++;
if (num % 2 == 0) {
num /= 2;
}
else {
num = num * 3 + 1;
}
}
max = Math.max(max, sum);
}
return max;
}
}