题目:
看下面的算式:
□□ 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
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要
思路:
使用穷举,晒去不符合的情况,后两个数字中必有一个大雨前两个最大的,一个小于前两个数中最小的。
#include <stdio.h>
#include <stdlib.h>
int find(char flag[],int number){ //查找数的每一位是否使用过
while(number>0){
if(flag[number%10]=='1')
return 0;
else{
flag[number%10]='1';
number/=10;
}
}
return 1;
}
int main()
{
int i,j,k,l;
char flag[10]; //1-9是否使用
for(i=12;i<=98;i++){ //从最小的12开始到最大的98开始枚举
for(j=i+1;j<=98;j++){
int temp=i*j;
for(k=12;k<i;k++){
if(temp/k>100&&temp%k==0) //三位整数
{
for(l=1;l<10;l++)
flag[l]='0';
flag[0]='1';
if(find(flag,i)&&find(flag,j)&&find(flag,k)&&find(flag,temp/k)) //确保没一个数字只是用一次
printf("%d %d %d %d\n",i,j,k,temp/k);
}
}
}
}
system("PAUSE");
return 0;
}