您的位置:首页 > 其它

蓝桥杯 神奇算式

2016-03-05 16:47 267 查看
标题:神奇算式

    由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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: