看下面的算式:
□□ 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
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要
在这个等式中,其实就是差一个倍数,而且三位数一定比两位数大,我们假设这四个数分别是a1,a2,b1,b2,其中b2为三位数,那么b2/a2=a1/b1,所以我们只要事先确定好a2和b1,再枚举倍数,最后再加上题目中的各种限制条件,比如数字中不能含有0,不重复等,就能求出所需要的等式,值得注意的是,倍数不一定是整数,但也不会是很复杂的小数,就按照每次增加0.5就可以,因为两位数乘以一个小数要想还是两位整数的话,这个小数最多只能有一位(根据题目中的约数条件),如果不放心,可以将增量减小到0.1,被忘了判断乘出来的数是不是整数哦。
#include<iostream>
using namespace std;
bool judge0(int n)
{
int a,b,c;
a=n%10;
n=n/10;
b=n%10;
n=n/10;
c=n%10;
if(a==0||b==0||c==0)
return 1;
return 0;
}
bool judgeR(int n1,int n2,int n3,int n4)
{
int num[10]={0};
int a1,a2;
int b1,b2;
int c1,c2;
int d1,d2,d3;
a1=n1%10,n1=n1/10,a2=n1%10;
b1=n2%10,n2=n2/10,b2=n2%10;
c1=n3%10,n3=n3/10,c2=n3%10;
d1=n4%10,n4=n4/10,d2=n4%10,n4=n4/10,d3=n4%10;
num[a1]++,num[a2]++,num[b1]++,num[b2]++,num[c1]++,num[c2]++,num[d1]++,num[d2]++,num[d3]++;
for(int i=1;i<10;i++)
{
if(num[i]>=2)
return 1;
}
return 0;
}
int main()
{
int cas=0;
int i,j;
double a1,a2,b1,b2;
double k;
for(i=50;i<=99;i++)
{
if(i%10==0||i%11==0)
continue;
for(j=10;j<=49;j++)
{
if(j%10==0||j%11==0)
continue;
a2=i;
b1=j;
for(k=1.5;k<=9.5;k=k+0.5)
{
a1=b1*k;
if((int)a1%10==0||(a1-(int)a1)!=0)
continue;
b2=a2*k;
if(judge0(b2)||(b2-(int)b2)!=0)
continue;
if(a1>99||b2>999)
continue;
if(judgeR(a1,a2,b1,b2))
continue;
cas++;
cout<<a1<<" * "<<a2<<" = "<<b1<<" * "<<b2<<endl;
}
}
}
cout<<cas;
return 0;
}