标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
结果如下
6*201=1206
6*210=1260
21*60=1260
15*93=1395
35*41=1435
3*501=1503
3*510=1530
30*51=1530
21*87=1827
27*81=2187
9*351=3159
8*473=3784
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
# include<stdio.h>
using namespace std;
bool test(int res,int first,int second)//测试函数 res为右边数字
{
//将等式右边数字放入数组
int flag[4];
for(int i=0;i<4;i++)
{
flag[i]=res%10;
res/=10;
}
for(int i=0;i<4;i++) //右边数字无重复
{
for(int j=i+1;j<4;j++)
{
if(flag[i]==flag[j])
return false;
}
}
//将等式左边数码放入数组,把first second每个位放到一个数组中,并判断其是否重复
int flag_2[10];
int p=0;
while(first>0)
{
flag_2[p]=first%10;
first=first/10;
p++;
}
while(second>0)
{
flag_2[p]=second%10;
second=second/10;
p++;
}
if(p!=4)
{
return false;
}else
{
for(int i=0;i<4;i++)
for(int j=i+1;j<4;j++)
{
if(flag_2[i]==flag_2[j])
return false;
}
}
//左边的数码右边必须出现
for(int i=0;i<4;i++)
{
int yes=0;
for(int j=0;j<4;j++)
{
if(flag_2[i]==flag[j])
yes=1;
}
if(yes==0)
return false;
}
return true;
}
int main()
{
int first ,second;
for(int i=1000;i<9999;i++)
{
for(int j=1;j*j<=i;j++) //根据对称性,为了避免相等性,取一半进行计算
{
if(i%j==0)
{
first =j;
second=i/j;
if(test(i,first,second)==true)
{
printf("%d*%d=%d\n",first,second,i);
}
}
}
}
return 0;
}
结果如下
6*201=1206
6*210=1260
21*60=1260
15*93=1395
35*41=1435
3*501=1503
3*510=1530
30*51=1530
21*87=1827
27*81=2187
9*351=3159
8*473=3784