【java/math】神奇数字6174

下面是一段有趣的程序。

代码:

复制代码
package com.hy.lab.endlessloop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * 神奇数字6174
 * 如果随机找一个四位数
 * 将各位按降序排列得到最大的四位数
 * 将各位按升序排列得到最小的四位数
 * 取最大数与最小数的差值
 * 如果其不等于6174,就以此值代替随机数重复以上三步运算
 * 你会发现有限次数内6174就会出现
 * 这个结论对任何四位数都成立
 */
public class Test {
    public static void main(String[] args) throws IOException {
        String expr;
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        for(;;) {
            System.out.print("按e退出,其他键继续:");
            expr=br.readLine();
            if(expr.equalsIgnoreCase("e")) {
                break;
            }

            int seed=rnd(1000,9999);
            System.out.println("我们随机地选择了"+seed+"这个四位数");

            int idx=0;
            for(;;){
                idx++;
                seed=getMaxMinusMin(seed);

                if(seed==6174){
                    System.out.println("循环了"+idx+"次得到神奇数字6174。\n");
                    idx=0;
                    break;
                }
            }

        }
    }

    /**
     * 将四位数seed分别取其千百十个位,重新组合成最大的四位数和最小的四位数,取其差值
     * @param seed 输入的四位数
     * @return 最大值-最小值
     */
    private static int getMaxMinusMin(int seed){
        int a=seed/1000;
        int b=seed/100-10*a;
        int c=seed/10-100*a-10*b;
        int d=seed % 10;

        int[] arr={a,b,c,d};
        Arrays.sort(arr);

        int max=1000*arr[3]+100*arr[2]+10*arr[1]+arr[0];
        System.out.println("其各位数字组成的最大数是:"+max);

        int min=1000*arr[0]+100*arr[1]+10*arr[2]+arr[3];
        System.out.println("其各位数字组成的最小数是:"+min);

        int diff=max-min;
        System.out.println("它们的差是:"+diff);

        return max-min;
    }


    /**
     * get a random integer between min and max
     * @param min
     * @param max
     * @return
     */
    private static int rnd(int min,int max) {
        return (int)(min+Math.random()*(max-min+1));
    }
}
复制代码

输出:

复制代码
按e退出,其他键继续:7
我们随机地选择了7740这个四位数
其各位数字组成的最大数是:7740
其各位数字组成的最小数是:477
它们的差是:7263
其各位数字组成的最大数是:7632
其各位数字组成的最小数是:2367
它们的差是:5265
其各位数字组成的最大数是:6552
其各位数字组成的最小数是:2556
它们的差是:3996
其各位数字组成的最大数是:9963
其各位数字组成的最小数是:3699
它们的差是:6264
其各位数字组成的最大数是:6642
其各位数字组成的最小数是:2466
它们的差是:4176
其各位数字组成的最大数是:7641
其各位数字组成的最小数是:1467
它们的差是:6174
循环了6次得到神奇数字6174。

按e退出,其他键继续:l
我们随机地选择了3414这个四位数
其各位数字组成的最大数是:4431
其各位数字组成的最小数是:1344
它们的差是:3087
其各位数字组成的最大数是:8730
其各位数字组成的最小数是:378
它们的差是:8352
其各位数字组成的最大数是:8532
其各位数字组成的最小数是:2358
它们的差是:6174
循环了3次得到神奇数字6174。

按e退出,其他键继续:;
我们随机地选择了5002这个四位数
其各位数字组成的最大数是:5200
其各位数字组成的最小数是:25
它们的差是:5175
其各位数字组成的最大数是:7551
其各位数字组成的最小数是:1557
它们的差是:5994
其各位数字组成的最大数是:9954
其各位数字组成的最小数是:4599
它们的差是:5355
其各位数字组成的最大数是:5553
其各位数字组成的最小数是:3555
它们的差是:1998
其各位数字组成的最大数是:9981
其各位数字组成的最小数是:1899
它们的差是:8082
其各位数字组成的最大数是:8820
其各位数字组成的最小数是:288
它们的差是:8532
其各位数字组成的最大数是:8532
其各位数字组成的最小数是:2358
它们的差是:6174
循环了7次得到神奇数字6174。

按e退出,其他键继续:。
我们随机地选择了1276这个四位数
其各位数字组成的最大数是:7621
其各位数字组成的最小数是:1267
它们的差是:6354
其各位数字组成的最大数是:6543
其各位数字组成的最小数是:3456
它们的差是:3087
其各位数字组成的最大数是:8730
其各位数字组成的最小数是:378
它们的差是:8352
其各位数字组成的最大数是:8532
其各位数字组成的最小数是:2358
它们的差是:6174
循环了4次得到神奇数字6174。

按e退出,其他键继续:‘
我们随机地选择了6467这个四位数
其各位数字组成的最大数是:7664
其各位数字组成的最小数是:4667
它们的差是:2997
其各位数字组成的最大数是:9972
其各位数字组成的最小数是:2799
它们的差是:7173
其各位数字组成的最大数是:7731
其各位数字组成的最小数是:1377
它们的差是:6354
其各位数字组成的最大数是:6543
其各位数字组成的最小数是:3456
它们的差是:3087
其各位数字组成的最大数是:8730
其各位数字组成的最小数是:378
它们的差是:8352
其各位数字组成的最大数是:8532
其各位数字组成的最小数是:2358
它们的差是:6174
循环了6次得到神奇数字6174。

按e退出,其他键继续:
我们随机地选择了6828这个四位数
其各位数字组成的最大数是:8862
其各位数字组成的最小数是:2688
它们的差是:6174
循环了1次得到神奇数字6174。

按e退出,其他键继续:D
我们随机地选择了3005这个四位数
其各位数字组成的最大数是:5300
其各位数字组成的最小数是:35
它们的差是:5265
其各位数字组成的最大数是:6552
其各位数字组成的最小数是:2556
它们的差是:3996
其各位数字组成的最大数是:9963
其各位数字组成的最小数是:3699
它们的差是:6264
其各位数字组成的最大数是:6642
其各位数字组成的最小数是:2466
它们的差是:4176
其各位数字组成的最大数是:7641
其各位数字组成的最小数是:1467
它们的差是:6174
循环了5次得到神奇数字6174。

按e退出,其他键继续:
复制代码

 

参考书目:《数学奇观  让数学之美带给你灵感和启发》P38 (美)阿尔弗雷德.S.波萨门蒂 著  上海科学教育出版社出版

END

posted @   逆火狂飙  阅读(551)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2021-12-15 【MYSQL】如何解决 java.sql.SQLException:null,message from Server:"Host 'xxx' is not allowed to connect to this MySQL Server"
2021-12-15 【MySQL】如何解决 javax.net.SSLException Message:Closeing inbound before receiving peer's close_notify
2021-12-15 【MySQL】让本机数据库能从别的机器访问的必要设置 附 Java连接MySQL8.011版的经典JDBC程序
2021-12-15 【MySQL】The server time zone value 'xxxxxx' is unrecognized or represents more than one time zone 解决方案
2021-12-15 【MySql】8.0.11版下载安装地址
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示