蓝桥杯-猜算式

                     猜算式
看下面的算式:

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

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

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

 1 #include<cstdio>
 2 #include<string.h>
 3 
 4 int vis[10000];
 5 
 6 int main()
 7 {
 8     int a,b,c,d,e,f;
 9     int m,n,p,q,x,y,z;
10     memset(vis,0,sizeof(vis));
11     for(a=1;a<=9;a++)
12     {
13         vis[a] = 1;
14         for(b=1;b<=9;b++)
15         {
16             if(vis[b])
17                 continue;
18             vis[b]=1;
19             for(c=1;c<=9;c++)
20             {
21                 if(vis[c])
22                     continue;
23                 vis[c]=1;
24                 for(d=1;d<=9;d++)
25                 {
26                     if(vis[d])
27                         continue;
28                     vis[d]=1;
29                     for(e=1;e<=9;e++)
30                     {
31                         if(vis[e])
32                             continue;
33                         vis[e]=1;
34                         for(f=1;f<=9;f++)
35                         {
36                             if(vis[f])
37                                 continue;
38                             vis[f]=1;
39                             m=a*10+b;
40                             n=c*10+d;
41                             p=e*10+f;
42                             if(m*n%p==0)
43                             {    
44                                 q=m*n/p;
45                                 x=q%10;
46                                 y=(q/10)%10;
47                                 z=q/100;
48                                 if(!x||!y||!z||x==y||y==z||x==z||vis[x]||vis[y]||vis[z])
49                                 {
50                                     vis[f]=0;
51                                     continue;
52                                 }
53                                 else if(vis[m*n])//左边的两个乘数交换算同一方案,不要重复输出
54                                 {
55                                     vis[f]=0;
56                                     continue;
57                                 }
58                                 else
59                                 {
60                                     vis[m*n]=1;
61                                     printf("%d x %d = %d x %d
",m,n,p,q);
62                                 }
63                                 
64                             }
65                             else
66                             {
67                                 vis[f]=0;
68                                 continue;
69                             }
70                             vis[f]=0;
71                         }//f
72                         vis[e]=0;//因为e又要开始循环,所以都置成0
73                         vis[f]=0;
74                     }//e
75                     vis[d]=0;
76                     vis[e]=0;
77                     vis[f]=0;
78                 }//d
79                 vis[c]=0;
80                 vis[d]=0;
81                 vis[e]=0;
82                 vis[f]=0;
83             }//c
84             vis[b]=0;
85             vis[c]=0;
86             vis[d]=0;
87             vis[e]=0;
88             vis[f]=0;
89         }//b
90         vis[a]=0;
91         vis[b]=0;
92         vis[c]=0;
93         vis[d]=0;
94         vis[e]=0;
95         vis[f]=0;
96     }//a
97     return 0;
98 }
原文地址:https://www.cnblogs.com/youdiankun/p/3612882.html