计算任选 3个 (1 到 9 )的自然数,他们能通过 加 减 乘 除 运算组合 形成 24 。例如 , 1,3,8 就能 通过 1X3X8 这样的运算 得到 24. 或者 7+8 +9 = 24

 思路分析:7+8 +9 = 24,三个数,两个操作符

1、使用三层for循环完成三个数的遍历,并且利用三层for循环中的两个内循环完成两个操作符4*4=16次的运算,第三次循环完成判断

2、第一次循环只有一个数 7+8 +9中的7

3、第二次循环能得到两个数7、8,这时对7、8进行加减乘除,也就完成两个操作符中的一个

4、第三次循环能得到7+8 +9中的7、8、9,就能完成两个操作符中的第二个

5、只要第二个操作符加减乘除中的一个满足条件的i、j、k都算结果,放置到结果集中

 

public List<List<Integer>> algo() {
        final Integer NUM = 24;
        List<List<Integer>> lists = new ArrayList<>();
        //三个数字运算,两次运算符
        //暴力算法 总共花费O(9*9*9)时间复杂度
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                //计算第一个加减乘除的值
                int jia = i + j;
                int jian = i - j;
                int cheng = i * j;
                int chu = i / j;
                for (int k = 1; k <= 9; k++) {
                    //完成 i + j +-*/ k == 224 的逻辑
                    secondCal(NUM, lists, i, j, jia, k);
                    //完成 i - j +-*/ k == 24 的逻辑
                    // i - j 小于3必不可能满足条件
                    if(i - j > 2){
                        secondCal(NUM, lists, i, j, jian, k);
                    }

                    //完成 i * j +-*/ k == 24 的逻辑
                    secondCal(NUM, lists, i, j, cheng, k);
                    //完成 i / j +-*/ k == 24 的逻辑
                    //需要排除i/j产生余数的情况,并且满足i>j
                    if(i >=j && i % j == 0){
                        secondCal(NUM, lists, i, j, chu, k);
                    }

                }
            }
        }
        return lists;
    }

    private void secondCal(Integer NUM, List<List<Integer>> lists, int i, int j, int num, int k) {
        //计算第二个加减乘除的值
        int num_jia = num + k;
        int num_jian = num - k;
        int num_cheng = num * k;
        int num_chu = num / k;
        //去除num / k有余数的情况
        if(num % k != 0){
            //num / k产生余数,num_chu设置成非NUM
            num_chu = Integer.MAX_VALUE;
        }
        //判断结果是否满足要求
        if(num_jia == NUM || num_jian == NUM ||num_cheng == NUM ||num_chu == NUM){
            List<Integer> list = new ArrayList<>();
            list.add(i);
            list.add(j);
            list.add(k);
            lists.add(list);
            System.out.println("num="+num+" k="+k);
            System.out.println(list);
        }
    }

展示部分结果:

结果上面的num表示 i 和 j 的加减乘除

num=4 k=6
[7, 3, 6]
num=28 k=4
[7, 4, 4]
num=3 k=8
[7, 4, 8]
num=12 k=2
[7, 5, 2]
num=15 k=9
[7, 8, 9]
num=16 k=8
[7, 9, 8]
num=8 k=3
[8, 1, 3]
num=8 k=3
[8, 1, 3]
num=6 k=4
[8, 2, 4]
num=4 k=6
[8, 2, 6]
num=16 k=8
[8, 2, 8]
num=24 k=1
[8, 3, 1]
num=12 k=2
[8, 4, 2]
num=4 k=6
[8, 4, 6]
num=32 k=8
[8, 4, 8]
num=3 k=8
[8, 5, 8]
num=48 k=2
[8, 6, 2]
num=15 k=9
[8, 7, 9]
num=16 k=8
[8, 8, 8]
num=72 k=3
[8, 9, 3]
num=17 k=7
[8, 9, 7]
num=8 k=3
[9, 1, 3]
num=18 k=6
[9, 2, 6]
num=12 k=2
[9, 3, 2]
num=27 k=3
[9, 3, 3]
num=6 k=4
[9, 3, 4]
num=3 k=8
[9, 3, 8]
num=4 k=6
[9, 5, 6]
num=3 k=8
[9, 6, 8]
num=15 k=9
[9, 6, 9]
num=16 k=8
[9, 7, 8]
num=72 k=3
[9, 8, 3]
num=17 k=7
[9, 8, 7]
num=18 k=6
[9, 9, 6]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值