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 .....

请编程,输出所有可能的情况!

注意:左边的两个乘数交换算同一方案,不要重复输出!

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。 相关的工程文件不要拷入。 对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性; 不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

 1 #include<stdio.h>
 2 #include<string.h>
 3 bool use[10];//访问标记数组
 4 int a[10];//判断a与b的积是否出现过
 5 int yin1,yin2,yin3,yin4;
 6 int count=0;
 7 void dfs(int begin){  
 8     if(begin==10){
 9         yin1=a[1]*10+a[2];
10         yin2=a[3]*10+a[4];
11         yin3=a[5]*10+a[6];
12         yin4=a[7]*100+a[8]*10+a[9];
13         if((yin1*yin2==yin3*yin4) && yin1<yin2){
14             count++;
15             printf("%2d*%2d = %2d*%3d
",yin1,yin2,yin3,yin4);
16         }
17         return; 
18     }  
19     for(int i=1; i<=9; i++){
20         if(!use[i]){
21             use[i] = true;
22             a[begin]=i;
23             dfs(begin+1);
24             use[i] = false;
25         }
26     }  
27 }  
28 int main(){  
29     memset(use,false,sizeof(use));
30     dfs(1);
31     printf("
共有%d个.",count);
32     return 0;
33 }