1. 问题描述:
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
---------------------
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容
2. 思路分析:
① 首先将文字写成字母表达的式子,把上面的文字分别使用不同的字母来代替,这样做为了能够让代码来表示其中的数字
a b c d
+ e f g b
----------------
e f c b i
对于这种问题我们想得到的肯定是枚举加上条件判断的办法,尝试每一种可能的结果但是由于涉及到的变量比较多,假如直接进行一一枚举的话会嵌套很多重的循环这样写的代码就会很冗长而且容易出现错误,所以我们需要对给出的算式进行简单的分析从而确定一些数字的取值范围这样才更方便我们进行筛选符合条件的数字
② 我们知道假如9999 + 9999那么每一位上的进位只能是1,所以很容易推断出来e = 1,接下来考虑a和f,因为e = 1了,所以a只能等于8或者9,假如a = 8,那么需要这一位上需要加上来自于低位上的进位这样才可以8 + 1 + 1 = 10那么f = 0
8 b c d
+ 1 0 g b
1 0 c b i
所以b只能是9,而且需要来自于低位的进位,但是这个时候c = 1要求是所有的汉字不能够相同,所以a只能等于9
所以推断出f = 0,
9 b c d
+ 1 0 g b
1 0 c b i
b不等于c那么肯定来自于低位的进位所以c + g 肯定大于了10,所以c = b + 1,c + g > 10,所以接下来就只剩下b,d,g,i四个变量的四层循环的枚举加上判断条件就可以了
假如判断是当前变量中有重复的话那么直接continue就可以了,而且经过上面的判断之后那么接下来的变量只能够从2到9开始枚举
3. 求解的答案只有一个为1085,具体的代码如下:
public class Main {
public static void main(String[] args) {
//首先要得出数学算式的模型
/*
a b c d
+ e f g b
----------------
e f c b i
*/
/*
9 b c d
+ 1 0 g b
----------------
1 0 c b i
*/
for(int b = 2; b < 9; b++){
for(int d = 2; d < 9; d++){
if(b == d) continue;
for(int g = 2; g < 9; g++){
if(b == g || d == g) continue;
//进入到这里说明已经将b,d,g重复的数字筛选掉了
int c = b + 1;
if(c == d || c == g || c + g <= 10) continue;
for(int i = 1; i <= 9; i++){
if(i == b || i == c || i == d || i == g || i == 1 || i == 0) continue;
int sum1 = 9000 + b * 100 + c * 10 + d;
int sum2 = 1000 + g * 10 + b;
int res = 10000 + c * 100 + b * 10;
if(sum1 + sum2 >= res + i && res + i >= sum1 + sum2){
System.out.printf("%2d%d%d%d\n", 9, b, c, d);
System.out.printf("%2d%d%d%d\n", 1, 0, g, b);
System.out.printf("%d%d%d%d%d\n",1, 0, c, b, i);
System.out.print("\n");
}
}
}
}
}
}
}