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