您的位置:首页 > 其它

【蓝桥杯】【马虎的算式】

2017-11-06 15:40 204 查看
题目

小明是一个急性子,上小学的时候经常把老师写在黑板上的题目抄错。

有一次,老师出得题目是:36*495=? 他却给抄成了:396*45=?

但结果却很戏剧性,他的答案竟然是对的!!

因为36*495=396*45=17820

类似这样的巧合情况可能还有很多,

比如:27*594=297*54

假设a b c d e代表1-9不同的5个数字(注意是各不相同的数字,且不含0)

能满足形如:ab*cde=adb*ce这样的算式一共有多少种呢?

分析

构造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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: