力扣1024活动 根据你手中的卡片判断能否合成1024 Java程序

发布于:2022-10-20 ⋅ 阅读:(270) ⋅ 点赞:(0)

力扣1024活动 根据你手中的卡片判断能否合成1024 Java程序

程序思路

暴力列举所有的可能,然后挑选出其中的所有能合成1024的解

说明

将自己的数字卡和符号卡替换进代码中的两个数组中即可

代码

import java.util.HashSet;

/**
 * Created by IntelliJ IDEA.
 *
 * @Project : 1024
 * @Author : XLrong
 * @create 2022/10/18
 */
public class count {
    private static int MAX = (int)(Math.pow(2, 31) - 1);    // 32位int最大值
    public static void main(String[] args) {
        int[] nums = {1024, 1024, 1024, 1024, 11, 19, 11, 31, 29, 30, 18, 2, 2, 1, 2, 17, 1, 7, 1024};  // 这些是我目前抢到的数,可以将自己的写进去
        String[] flags = {"|", "|", "|", "|", "//", "^"}; // 这些是我目前抢到的符号,代码目前也只有相应的计算,后续会进行补充
        int num1 = 0, num2 = 0, num3 = 0;  // 3个num是三次运算产生的值, num3也就是最终的值
        HashSet<String> strHs = new HashSet<>();
        for (int i = 0; i < nums.length; i++) { // 数字1
            for (int j = 0; j < flags.length; j++) {    // 符号1
                for (int k = 0; k < nums.length; k++) { // 数字2
                    if (flags[j] == "|") {  // “|”运算
                        num1 = nums[i] | nums[k];
                    } else if (flags[j] == "//") {  // “//”运算
                        if (nums[k] == 0) { // 分母不为0
                            continue;
                        } num1 = nums[i] / nums[k];
                    } else if (flags[j] == "**") {  // “**”运算
                        if ((int)Math.pow(nums[i], nums[k]) > MAX) {    // 判断计算结果判断溢出
                            continue;
                        } else {
                            num1 = (int) Math.pow(nums[i], nums[k]);
                        }
                    } else if (flags[j] == "<<") {  // “<<”运算
                        if (nums[i] << nums[k] > MAX) { // 判断计算结果判断溢出
                            continue;
                        } else {
                            num1 = nums[i] << nums[k];
                        }
                    } else if (flags[j] == "^") {   // “^”运算
                        num1 = nums[i] ^ nums[k];
                    } else if(flags[j] == "-") {    // “-”运算
                        num1 = nums[i] - nums[k];
                    } else if (flags[j] == "+") {   // “+”运算
                        if (nums[i] + nums[k] > MAX) {
                            continue;
                        } else {
                            num1 = nums[i] + nums[k];
                        }
                    } else if (flags[j] == "*") {   // “*”运算
                        if (nums[i] * nums[k] > MAX) {
                            continue;
                        } else {
                            num1 = nums[i] * nums[k];
                        }
                    } else if (flags[j] == "%") {   // “%”运算
                        num1 = nums[i] % nums[k];
                    } else if (flags[j] == "&") {   // “&”运算
                        num1 = nums[i] & nums[k];
                    } else if (flags[j] == ">>") {  // “>>”运算
                        if (nums[i] >> nums[k] > MAX) {
                            continue;
                        } else {
                            num1 = nums[i] >> nums[k];
                        }
                    } else {}
                    for (int l = 0; l < flags.length; l++) {    // 符号2
                        for (int m = 0; m < nums.length; m++) { // 数字3
                            if (flags[l] == "|") {
                                num2 = num1 | nums[m];
                            } else if (flags[l] == "//") {
                                if (nums[m] == 0) {
                                    continue;
                                }
                                num2 = num1 / nums[m];
                            } else if (flags[l] == "**") {
                                if ((int)Math.pow(num1, nums[m]) > MAX) {
                                    continue;
                                } else {
                                    num2 = (int) Math.pow(num1, nums[m]);
                                }
                            } else if (flags[l] == "<<") {
                                if (num1 << nums[m] > MAX) {
                                    continue;
                                } else {
                                    num2 = num1 << nums[m];
                                }
                            } else if (flags[l] == "^") {
                                num2 = num1 ^ nums[m];
                            } else if(flags[l] == "-") {
                                num2 = num1 - nums[m];
                            }  else if (flags[l] == "+") {
                                if (num1 + nums[m] > MAX) {
                                    continue;
                                } else {
                                    num2 = num1 + nums[m];
                                }
                            } else if (flags[l] == "*") {
                                if (num1 * nums[m] > MAX) {
                                    continue;
                                } else {
                                    num2 = num1 * nums[m];
                                }
                            } else if (flags[l] == "%") {
                                num2 = num1 % nums[m];
                            } else if (flags[l] == "&") {
                                num2 = num1 & nums[m];
                            } else if (flags[l] == ">>") {
                                if (num1 >> nums[m] > MAX) {
                                    continue;
                                } else {
                                    num2 = num1 >> nums[m];
                                }
                            } else {}
                            for (int n = 0; n < flags.length; n++) {    // 符号3
                                for (int o = 0; o < nums.length; o++) { // 数字4
                                    if (flags[n] == "|") {
                                        num3 = num2 | nums[o];
                                    } else if (flags[n] == "//") {
                                        if (nums[o] == 0) {
                                            continue;
                                        }
                                        num3 = num2 / nums[o];
                                    } else if (flags[n] == "**") {
                                        if ((int)Math.pow(num2, nums[o]) > MAX) {
                                            continue;
                                        } else {
                                            num3 = (int) Math.pow(num2, nums[o]);
                                        }
                                    } else if (flags[n] == "<<") {
                                        if (num2 << nums[o] > MAX) {
                                            continue;
                                        } else {
                                            num3 = num2 << nums[o];
                                        }
                                    } else if (flags[n] == "^") {
                                        num3 = num2 ^ nums[o];
                                    } else if(flags[n] == "-") {
                                        num3 = num2 - nums[o];
                                    }  else if (flags[n] == "+") {
                                        if (num2 + nums[o] > MAX) {
                                            continue;
                                        } else {
                                            num3 = num2 + nums[o];
                                        }
                                    } else if (flags[n] == "*") {
                                        if (num2 * nums[o] > MAX) {
                                            continue;
                                        } else {
                                            num3 = num2 * nums[o];
                                        }
                                    } else if (flags[n] == "%") {
                                        num3 = num2 % nums[o];
                                    } else if (flags[n] == "&") {
                                        num3 = num2 & nums[o];
                                    } else if (flags[n] == ">>") {
                                        if (num2 >> nums[o] > MAX) {
                                            continue;
                                        } else {
                                            num3 = num2 >> nums[o];
                                        }
                                    } else {}
                                    HashSet<Integer> hs1 = new HashSet<>(); // 用于判断是否有卡片重用
                                    HashSet<Integer> hs2 = new HashSet<>();
                                    if(num3 == 1024 && hs1.add(i) && hs2.add(j) && hs1.add(k) && hs2.add(l) && hs1.add(m) &&
                                            hs2.add(n) && hs1.add(o) && strHs.add(nums[i] + flags[j] + nums[k] + flags[l] + nums[m] + flags[n] + nums[o] + " = " + num3)) { // 判断是否有卡片重用
                                        System.out.println(nums[i] + flags[j] + nums[k] + flags[l] + nums[m] + flags[n] + nums[o] + " = " + num3);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

部分输出结果

1024|1024|1024|1024 = 1024
1024|1024|1024//1 = 1024
1024|1024|11^11 = 1024
1024|1024|2^2 = 1024
1024|1024|1^1 = 1024
1024|1024//1|1024 = 1024
1024|1024^1024|1024 = 1024
1024|11|1024^11 = 1024
1024|11|29^31 = 1024
1024|11|30^31 = 1024
1024|11|2^11 = 1024
1024|11|1^11 = 1024
1024|11//1^11 = 1024
1024|11^11|1024 = 1024
1024|11^11//1 = 1024
1024|19|29^31 = 1024
1024|19|30^31 = 1024
1024|29|11^31 = 1024
1024|29|19^31 = 1024
1024|29|30^31 = 1024
1024|29|18^31 = 1024
1024|29|2^31 = 1024
1024|29|7^31 = 1024
1024|30|11^31 = 1024
1024|30|19^31 = 1024
1024|30|29^31 = 1024
1024|30|1^31 = 1024
1024|30|17^31 = 1024
1024|30|7^31 = 1024
1024|18|29^31 = 1024
1024|18|1^19 = 1024
1024|18|17^19 = 1024
1024|2|1024^2 = 1024
1024|2|11^11 = 1024
1024|2|29^31 = 1024
1024|2|2^2 = 1024
1024|2|17^19 = 1024
1024|2//1^2 = 1024
1024|2^2|1024 = 1024
1024|2^2//1 = 1024
1024|1|1024^1 = 1024
1024|1|11^11 = 1024
1024|1|30^31 = 1024
1024|1|18^19 = 1024
1024|1^1|1024 = 1024