java 方法实现数学黑洞

昨天老师留了一个作业,用java实现一个数学黑洞

main方法,实现数学黑洞验证。
* 提供任意一个非全部数位相同的4位数字,排列组合4位数字,用最大值-最小值,结果继续排列,并计算。最多7次,结果停止在6174。
* 如: 9875
* 9875 - 5789 = 4086
* 8640 - 0468 = 8172
* 8721 - 1278 = 7443
* 7443 - 3447 = 3996
* 9963 - 3699 = 6264
* 6642 - 2466 = 4176
* 7641 - 1467 = 6174

发现网上几篇文章都是一个一个计算每位数值

int g = (num / 1) % 10;     //个位
*
*   int s = (num / 10) % 10;   //十位
*
*   int b = (num / 100) % 10;      //百位
*
*   int b = (num / 1000) % 10;    //千位   

于是

public class TestBlackHole {
    public static void main(String[] args) {
        /*返回的数值是一个四位不重复的数值*/
        int number = putNumber();
            /*使用arrayList存储每一位数据 因为可以使用 Arrays 工具类升序排序 */

        /*最小值*/
        int minNumber = MinNumber(number);
        /*最大值*/
        int maxNumber = MaxNumber(number);
        /*相减值*/
        int nextNumber = maxNumber-minNumber;
        /*计算次数*/
        int total=1;
        while (nextNumber!=6174){
            minNumber= MinNumber(nextNumber);
            maxNumber=MaxNumber(nextNumber);
            nextNumber=maxNumber-minNumber;
            System.out.println(maxNumber+"-"+minNumber+"=="+nextNumber);
            total+=1;
        }
        System.out.println("计算次数为"+total);
    }




        /*获取用户输入值*/
    /*
    *1 首先判断用户输入是否为四位数
    *2 其次把四个数依次赋值到map 集合中,由于map的特性 key值必须唯一,所有可以判断出该数是否有相同值
    *3  把符合要求的值返回给主方法
    *4 主方法调用 maxNumber 和 minNumber方法 计算出这个四位数的最大值和最小值
    *                        底层方法  最大值 Arrays 工具类升序排序
    *                                  最小值 Arrays 降序排序 必须使用Collections.reversOrder 不支持int double char 支持包装类
    * 5 返回结果相减得到下一次的值 遍历上述方法直到得到6174 结束循环,判断循环次数
    * */
    public static int putNumber(){

        /*获取系统输入值*/
        System.out.println("请输入四位不可重复的数");
        int num =new Scanner(System.in).nextInt();
        /*如果不是四位数就重新输入*/
        while (num/1000>=10){
            num=putNumber();
        }
        /*每位存储到hashMap 中和arrayList<>集合中*/
        HashMap<Integer,Integer> map = new HashMap<>();
        /*把个十百千分别存储在每个map */
        for (int i = 1; i <=4 ; i++) {
            int pow = (int) Math.pow(10, i );
        
            map.put(num/(pow/10)%10,num/(pow/10)%10);

        }
        /*
        * hashMap中key的值是唯一的,key 和 value 可以相同
        *  所以用key来判断是否有数值相同
        * */
        System.out.println("map长度"+map.size());
        if(map.size()<4){
            map.clear();
            num=putNumber();
        }
        return num;
    }




    /*得到最大值*/
    public static  int MaxNumber(int number){
        Integer[] num = new  Integer[4];

        for (int i = 1; i <=4 ; i++) {
            int pow = (int) Math.pow(10, i );
            num[i-1]=number/(pow/10)%10;
        }
       /*
       *  1 降序排序 Collections 不支持基本类型(int,double,char) 降序Arrays.sort(num, Collections.reverseOrder());
       *  2 然后循环四个数包装成最大值
       *  3 返回最大值
       *
       * */
        Arrays.sort(num, Collections.reverseOrder());
        int maxNumber=0;
        for (int i = 0; i <4 ; i++) {
            int pow = (int) Math.pow(10, i+1 );
            maxNumber += num[i]*1000/(pow/10);
        }
        return maxNumber;
    }






    /*得到最小值*/
    public static  int MinNumber(int number){
        int[] num = new  int[4];
        for (int i = 1; i <=4 ; i++) {
            int pow = (int) Math.pow(10, i );
            num[i-1]=number/(pow/10)%10;
        }

        /*
         *  1 升序排序 arrays.sort 默认升序
         *  2 然后循环四个数包装成最大值
         *  3 返回最大值
         *
         * */
        Arrays.sort(num);
        int minNumber=0;
        for (int i = 0; i <4 ; i++) {
            int pow = (int) Math.pow(10, i+1 );
            minNumber += num[i]*(1000/(pow/10));
        }
        return minNumber;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值