题目:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
B DEF
A + --- + ------- = 10
C GHI
这个算式中 A ~ I 代表 0 ~ 9 的数字,不同的字母代表不同的数字。
比如下面有两种解法:
6+8/3+952/714
5+3/1+972/486
问这个算式一共有多少种解法?
分析:
- 首先分析题目,式子中的九个字母所代表的数字组成的式子满足 == 10,问有多少种解法。注意:
DEF
是一个三位数的数字而不是三个数相乘。题目的意思可以理解为
:一个9位数的数字,取1 - 9的数字来填,要求这个数字不重复,然后将9位数的每个数的位置对应A - I,求满足上述式子的数的种数。 - 注意:这里会有两个小坑,
一是:
题目给的0 - 9,其实是1 - 9的数字,在代码中用0来除会报错。二是:
看题目给出的解法示例:6+8/3+952/714
,其中两个数是不能整除的,但是其通分后是可以整除的,所以在设置if判断时我们需要将式子稍微变形。 - 开始写代码计算
- 由于是填空题不用考虑太多直接干
暴力
:
由分析第2点,可以写出,直接9个for嵌套,if里面要求,每个组成的9位数不重复且满足式子 == 10
和通分后可以整除
- 代码也可以稍微精致一点,这里我用的java写,对于全排列的题用
回溯
是一个比较好的写法
- 由于是填空题不用考虑太多直接干
类似题目:
蓝桥杯JavaB组 2.纸牌三角形
代码:
答案:29
//暴力
public static void bruteForce() {
int result = 0;
for (int a = 1; a <= 9; a++) {
for (int b = 1; b <= 9; b++) {
for (int c = 1; c <= 9; c++) {
for (int d = 1; d <= 9; d++) {
for (int e = 1; e <= 9; e++) {
for (int f = 1; f <= 9; f++) {
for (int g = 1; g <= 9; g++) {
for (int h = 1; h <= 9; h++) {
for (int i = 1; i <= 9; i++) {
if((a + (((g * 100 + h * 10 + i) * b) + ((d * 100 + e * 10 + f) * c)) / ((g * 100 + h * 10 + i) * c) == 10)
&& ((((g * 100 + h * 10 + i) * b) + ((d * 100 + e * 10 + f) * c)) % ((g * 100 + h * 10 + i) * c)) == 0
&& a != b
&& a != c && a != d
&& a != e && a != f
&& a != g && a != h
&& a != i
&& b != c
&& b != d && b != e
&& b != f && b != g
&& b != h && b != i
&& c != d && c != e
&& c != f && c != g
&& c != h && c != i
&& d != e && d != f
&& d != g && d != h
&& d != i && e != f
&& e != g && e != h
&& e != i && f != g
&& f != h && f != i
&& g != h && g != i
&& h != i)
result++;
}
}
}
}
}
}
}
}
}
System.out.println(result);
}
//回溯
static int ans;
static int arr[] = {1,2,3,4,5,6,7,8,9};
static boolean check() {
int x = arr[3] * 100 + arr[4] * 10 + arr[5];
int y = arr[6] * 100 + arr[7] * 10 + arr[8];
if ((x * arr[2] + y * arr[1]) % (y * arr[2]) == 0 && arr[0] + ((x * arr[2] + y * arr[1]) / (y * arr[2])) == 10)
return true;
return false;
}
static void f(int k) {
if (k == 9) {
if (check())
ans++;
}
for (int i = k; i < 9; i++) {
{int temp = arr[i]; arr[i] = arr[k];arr[k] = temp;}
f(k + 1);
{int temp = arr[i]; arr[i] = arr[k];arr[k] = temp;}
}
}
//回溯法在main方法里是调用f(0)