看下面的算式:
□□ x □□ = □□ x □□□
它表示:两个两位数相乘等于一个两位数乘以一个三位数。
如果没有限定条件,这样的例子很多。
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!
比如:
46 x79 = 23 x 158
54 x69 = 27 x 138
54 x93 = 27 x 186
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要
参考代码:
//利用全排列,剔除不符合条件的项
#include<stdio.h>
#include<stdlib.h>
int arr[9]={1,2,3,4,5,6,7,8,9},n=9;
void swap(int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void print()
{
int m,n,x,y;
m=(arr[0])*10+(arr[1]);
n=(arr[2])*10+(arr[3]);
x=(arr[4])*10+(arr[5]);
y=(arr[6])*100+(arr[7])*10+(arr[8]);
if(m*n==x*y&&m<n)
printf("%dx%d=%dx%d\n",m,n,x,y);
}
void perm(int start,int end){
if(start==end){
print();
}else{
for(int i=start;i<=end;i++)
if(start==i||(start!=i&&arr[start]!=arr[i])){//剔除重复项
swap(start,i);
perm(start+1,end);
swap(start,i);
}
}
}
int main(){
int i,j;
//小→大,可以轻易剔除重复排列
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(arr[i]>arr[j])
swap(i,j);
perm(0,n-1);
}