【题目】
小明是一个急性子,上小学的时候经常把老师写在黑板上的题目抄错。
有一次,老师出得题目是:36495=? 他却给抄成了:39645=?
但结果却很戏剧性,他的答案竟然是对的!!
因为36495=39645=17820
类似这样的巧合情况可能还有很多,
比如:27594=29754
假设a b c d e代表1-9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如:abcde=adbce这样的算式一共有多少种呢?
【分析】
构造5个元素的数组,从9个数字的数组中取数字,找出所有的可能性。
注意递归和回溯。
【源码】
private static HashSet<String> sets;
public static void main(String[] args) {
sets = new HashSet<String>();
int[] a = new int[5];
int[] b = new int[9];
for (int i = 0; i < b.length; i++) {
b[i] = i + 1;
}
f(a, b, 0);
System.out.println(sets.size());
}
private static void f(int[] a, int[] b, int index) {
if (index == a.length) {
// 已经取出完毕
yz(a);
return;
}
for (int i = 0; i < b.length; i++) {
{
if (b[i] == -1) {
// 如果前面已经取走了,换一个数字来取
continue;
}
a[index] = b[i]; // 取数
b[i] = -1;// 置为-1,表示已经取走了
}
f(a, b, index + 1);
{
// 回溯
b[i] = a[index];
}
}
}
// ab*cde=adb*ce
//左边(a[0] * 10 + a[1]) * (a[2] * 100 + a[3] * 10 + a[4])
//右边(a[0] * 100 + a[3] * 10 + a[1])* (a[2] * 10 + a[4])
private static void yz(int[] a) {
if ((a[0] * 10 + a[1]) * (a[2] * 100 + a[3] * 10 + a[4]) ==
(a[0] * 100 + a[3] * 10 + a[1])* (a[2] * 10 + a[4])) {
StringBuilder sb = new StringBuilder();
sb.append(a[0]);
sb.append(a[1]);
sb.append("*");
sb.append(a[2]);
sb.append(a[3]);
sb.append(a[4]);
sb.append("=");
sb.append(a[0]);
sb.append(a[3]);
sb.append(a[1]);
sb.append("*");
sb.append(a[2]);
sb.append(a[4]);
sets.add(sb.toString());
}
}
【结果】
142