在正整数集上定义如下的迭代序列:
n → n/2 (若n为偶数)
n → 3n + 1 (若n为奇数)
从13开始应用上述规则,我们可以生成如下的序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出这个序列(从13开始到1结束)共有10项。尽管还没有被证明,但我们普遍认为,从任何数开始最终都能迭代至1(“考拉兹猜想”)。
从小于一百万的哪个数开始,能够生成最长的序列呢?
注: 序列开始生成后允许其中的项超过一百万。
public class Collatz_12 {
/*input: 数字num
* output: 这个序列的项数 count
* */
public static int Collatz(int num) {
int count = 1; //记录序列的个数
while(num > 1) {
// num是偶数
if(num % 2 == 0) {
num = num / 2;
count ++;
}
//num是奇数
else{
num = num * 3 + 1;
count ++;
}
}
return count;
}
public static void main(String[] args) {
int max = 0; //最长序列的项数
int n = 0; //最长序列数
for(int i=2; i<1000000; i++) {
if(Collatz(i) > max) {
n = i;
max = Collatz(i);
}
}
System.out.println(max);
System.out.println(n);
- Java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐