题目描述
从整数n开始,如果n是偶数 ,把它除以2;如果n是奇数,把它乘 3 加 1 ;用新得到的数字重复上述步骤,直到 n=1 时停止;
例如 :n = 22 时,该算法生成的序列是
22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
对于给定的 n ,该序列的元素(包括1)个数被称为 n 的循环节长度,在上述例子中,22 的循环节长度为16 ,输入 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
输入:每行包含两个整数 i 和 j
输出:按原来的顺序输出 i 和 j ,然后输出二者之间整数中的最大循环节 长度,在输出中应应于单独的一行;
定义方法判断奇偶数并记录循环节长度
//定义方法
public static int num(int n){
//记录生成的循环节长度,本身为1次
int number=1;
while(n!=1){
if(n%2==0){//偶数
n=n/2;
number++;//循环节长度增加
}else{//奇数
n=n*3+1;
number++;//循环节长度增加
}
}
return number;
}
对方法进行调用并按格式输入输出
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//定义输入数组格式
int arr[][]=new int [100][2];
//循环输入
for(int i=0;sc.hasNext()&&i<100;i++){
for (int j = 0; j <2; j++) {
arr[i][j]=sc.nextInt();
}
int max=0;//存储循环长度最长的
for (int k = arr[i][0]; k < arr[i][1]; k++) {
//调用方法计算每一行 i 到 j 之间数字循环接长度最长的
max=Math.max(max, num(k));
}
System.out.println(arr[i][0]+" "+arr[i][1]+" "+max);
}
手算也行其实