这里有三个数字 我们称 a+ c = c 且各个位上的数字不同。我们这里借助桶排序的思想来判断 1-9 这些数字有没有占用。
所以我们定义一个判断函数,用于判断 a b c三个数字是否符合要求。
然后暴力枚举:
a 从 123 到 987 开始枚举
有很多同学开始抬杠 111-999 岂不是更简单,因为 123 是最小的符合要求的数字,可以减少枚举的次数,987 是最大的符合要求的数字。
b 从 123 到 987-a枚举
这时候又会有很多同学来问,为什么不直接枚举与 a 不一样的数字呢,那么又得考虑每一位的问题,这样的模拟已经不是暴力法了,我们要做的就是在不改变完成难度的情况下,减少复杂度。所以要分清注次。
c = a+ b 这时候只要检查a b c 是否符合要求即可。 代码
package easy;
public class 算式问题 {
static int[] arr = new int[10]; //0-9
public static void main(String[] args) {
int sum = 0;
for (int a = 123; a < 987; a++) {
for (int b = 123; b < 987-a; b++) {
int c = a + b;
if (check(a, b, c) == 1) {
sum++;
}
System.out.println(a+"+"+b+"="+c);
System.out.println(sum);
}
}
}
static int check(int a,int b,int c) {
for (int i = 0; i < arr.length; i++) {
arr[i] = 0; //桶排序 让每个数出现的次数为0
arr[0] = 1; //题目要求不包括0 所以让0出现一次 之后就会排除0
}
//当首字母不为0 进入while循环
while (a != 0) {
//首先判断每一个数的最后一个位
if (arr[a%10] == 1) {
//首先判断一下arr[a%10]的次数是不是0 如果不是就继续 如果是就 说明该数已经出现了
return 0;
} else {
arr[a%10] = 1;
}
if (arr[b%10] == 1) {
return 0;
} else {
arr[b%10] = 1;
}
if (arr[c%10] == 1) {
return 0;
} else {
arr[c%10] = 1;
}
//把每一个数的最后一位去掉 接着循环判断
a = a/10;
b = b/10;
c = c/10;
}
return 1;
}
}



