猜算式
看下面的算式:
□□ 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 }