Java冰雹数计算

【题目】
冰雹数
任意给定一个正整数N ** (N<1000000)**
如果是偶数,执行: N / 2
如果是奇数,执行: N * 3 + 1
生成的新的数字再执行同样的动作,循环往复。通过观察发现
这个数字会一会儿上升到很高,一会儿又降落下来
就这样起起落落的,但最终必会落到“1”,
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度
求:
输入格式:
一个正整数N(N<1000000)
输出格式:
一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。
例如,输入:
10
程序应该输出:
52
再例如,输入:
100
程序应该输出:
9232
【分析】
首先这道题看似很简单,只需分析输入的数字是否奇偶数,然后一直判断操作等于1时停止,找出最大的冰雹数字就行了,那我们来试试
【代码一】

import java.util.Scanner;

public class Main{
    // 计最大数
    static int max = 0;
    public static void main(String[] args) {
        Scanner sr=new Scanner(System.in);
        int value = sr.nextInt();
            game(value);
        System.out.println(max);
    }
    static void game(int k){
        if (k==1){
            return;
        }
        // 运用三木运算符,判断k是否大于max,大于就替换,否则不变
        max = k>max?k:max;
        // 调用方法的参数也用的三木运算,判断k是奇是偶
        game(k%2==0?k/2:k*3+1);
    }
}

【二次分析】
通过【代码一】就一个数字计算到停止,拿示例9、10、100来试验,看数字是否正确,输入之后,输出分别为52、16、100,看这个答案和题中给的例子答案就对的上一个,然后我发现9和10的最大冰雹数竟然一致,10的冰雹过程是10、5、16、8、4、2、1结束,怎么和9一样,转念一想,10里面不就包含9吗,难道计算的是输入的数字[2,n),2到n里面所有数字的冰雹数,然后找出最大的?那稍作修改请看【代码二】
【代码二】

import java.util.Scanner;

public class Main{
    // 计最大数
    static int max = 0;
    public static void main(String[] args) {
        Scanner sr=new Scanner(System.in);
        int value = sr.nextInt();
        // 新增内容
        for (int i=2;i<=value;i++){
            game(i);
        }
        System.out.println(max);
    }
    static void game(int k){
        if (k==1){
            return;
        }
        // 运用三木运算符,判断k是否大于max,大于就替换,否则不变
        max = k>max?k:max;
        // 调用方法的参数也用的三木运算,判断k是奇是偶
        game(k%2==0?k/2:k*3+1);
    }
}

【结果】
我把我的想加入代码,输入9、10、100的答案果然和示例中的答案一致

猜你喜欢

转载自blog.csdn.net/our1624204500/article/details/106837498