1. 问题描述:
凑算式
B DEF
A + ---- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字
2. 思路分析:
① 由题目中可以知道A-I代表着1 - 9个不同的数字,所以我们首先想到的先求解出1-9数字的全排列然后对形成的每一个排列进行判断,题目中给出的例子中其中8 / 3是除不完的,但是我们将两个8 / 3与 952 / 714通分之后发现是可以进行整除的,所以这里是在判断的时候需要注意的一个点
② 全排列我们可以使用递归的方法:交换当前元素与当前元素之后(包括当前元素)的元素形成全排列,实际上这也是一个求解全排列的一个模板,我们可以记住直接使用,在求解出一个排列之后进行判断,即可以在出口的时候使用一个方法来判断当前数组中的排列是否满足题目的要求,判断的时候需要将两个分式进行通分,判断一下通分之后是否能够整除而且加上之前的那个数字是否等于10
③ 实际上这道题目考察的就是怎么样求解全排列,在出口的时候加上一些条件判断就可以了
3. 求解的结果有29种,代码如下:
public class Main {
static int count = 0;
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
f(arr, 0);
System.out.println(count);
}
private static void f(int[] arr, int k) {
if(k == 9){
if(check(arr)){
for(int i = 0; i < 9; i++){
System.out.print(arr[i] + " ");
}
System.out.print("\n");
count++;
}
return;
}
//注意i应该等于k这样才是对的,很容易写着写着就写成i = 0了
for(int i = k; i < 9; i++){
int t = arr[i];
arr[i] = arr[k];
arr[k] = t;
f(arr, k + 1);
t = arr[i];
arr[i] = arr[k];
arr[k] = t;
}
}
private static boolean check(int[] arr) {
//特别要注意下面有的需要添加上括号否则很容易出现错误
int x = arr[3] * 100 + arr[4] * 10 + arr[5];
int y = arr[6] * 100 + arr[7] * 10 + arr[8];
int t = arr[1] * y + arr[2] * x;
if(t % (arr[2] * y) == 0 && (arr[0] + t / (arr[2] * y)) == 10){
return true;
}
return false;
}
}