程序思路
暴力列举所有的可能,然后挑选出其中的所有能合成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