c语言 题目 猜算式,蓝桥杯竞赛题目(猜算式)
看下面的算式:
□□ 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
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class Main {
static boolean visited[] = new boolean[10];
static List k = new ArrayList();
static int[] vs = new int[10];
static HashSet rs = new HashSet();
public static void main(String[] args) {
long t1 =
System.currentTimeMillis();
dfs(1, 10);
for (String s : rs) {
System.out.println(s);
}
System.out.println(System.currentTimeMillis()
- t1);
}
private static void dfs(int begin, int end)
{
if (begin == end) {
check();
} else {
for (int i =
1; i <= 9; i++) {
if
(!visited[i]) {
visited[i]
= true;
vs[begin]
= i;
dfs(begin
+ 1, end);
visited[i]
= false;
}
}
}
}
private static void check() {
int a = vs[1] * 10 +
vs[2];
int b = vs[3] * 10 +
vs[4];
int c = vs[5] * 10 +
vs[6];
int d = vs[7] * 100 + vs[8] *
10 + vs[9];
if (a * b == c * d) {
if (a > b)
{
int
t = a;
a
= b;
b
= t;
}
rs.add(a +
"*" + b + "=" + c + "*" + d + "=" + a * b+","+c*d);
}
}
}
结果:
63*74=18*259=4662,4662
73*96=12*584=7008,7008
58*96=32*174=5568,5568
58*67=29*134=3886,3886
76*98=14*532=7448,7448
54*69=27*138=3726,3726
58*69=23*174=4002,4002
46*79=23*158=3634,3634
58*73=29*146=4234,4234
64*79=32*158=5056,5056
54*93=27*186=5022,5022