/*
* 看下面的算式:
□□ x □□ = □□ x □□□
它表示:两个两位数相乘等于一个两位数乘以一个三位数。
如果没有限定条件,这样的例子很多。
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!
比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....
请编程,输出所有可能的情况!
注意:左边的两个乘数交换算同一方案,不要重复输出!
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题
号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyTest11 {
public static void play(int n, int[] array) {
if (n == 9 && JudeEquation(array)) {
System.out.print(array[0] + "" + array[1] + " * " + array[2] + ""
+ array[3] + " = " + array[4] + "" + array[5] + " * "
+ array[6] + "" + array[7] + "" + array[8]);// 格式化输出
System.out.println();
return;
}
for (int i = 1; i < 10; i++) {
if (!JudeRepeat(array, i))
continue;
array[n] = i; // 赋值(1~9中的任意数字)
play(n + 1, array);// 递归调用
array[n] = 0;// 移除以选过的值
}
}
// 判断重复,如已选过的值则返回false
public static boolean JudeRepeat(int[] array, int value) {
for (int j = 0; j < array.length; j++) {
if (value == array[j])
return false;
}
return true;
}
//判断等式,是否满足
public static boolean JudeEquation(int array[]) {
int a = Integer.parseInt(array[0] + "" + array[1]);
int b = Integer.parseInt(array[2] + "" + array[3]);
int c = Integer.parseInt(array[4] + "" + array[5]);
int d = Integer.parseInt(array[6] + "" + array[7] + "" + array[8]);
if (a * b != c * d || a < b) // a<b技巧(这样就去除重复的算式)
return false;
return true;
}
public static void main(String[] args) {
int array[] = new int[9];
play(0, array);
}
}