猜算式
看下面的算式:□□ x □□ = □□ x □□□它表示:两个两位数相乘等于一个两位数乘以一个三位数。如果没有限定条件,这样的例子很多。但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。该算式中1至9的每个数字出现且只出现一次!比如:46 x 79 = 23 x 15854 x 69 = 27 x 13854 x 93 = 27 x 186.....请编程,输出所有可能的情况!注意:左边的两个乘数交换算同一方案,不要重复输出!不同方案的输出顺序不重要1 #include2 #include 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 else59 {60 vis[m*n]=1;61 printf("%d x %d = %d x %d\n",m,n,p,q);62 }63 64 }65 else66 {67 vis[f]=0;68 continue;69 }70 vis[f]=0;71 }//f72 vis[e]=0;//因为e又要开始循环,所以都置成073 vis[f]=0;74 }//e75 vis[d]=0;76 vis[e]=0;77 vis[f]=0;78 }//d79 vis[c]=0;80 vis[d]=0;81 vis[e]=0;82 vis[f]=0;83 }//c84 vis[b]=0;85 vis[c]=0;86 vis[d]=0;87 vis[e]=0;88 vis[f]=0;89 }//b90 vis[a]=0;91 vis[b]=0;92 vis[c]=0;93 vis[d]=0;94 vis[e]=0;95 vis[f]=0;96 }//a97 return 0;98 }