您的位置:首页 > 其它

蓝桥杯_神奇算式

2015-03-08 16:41 316 查看
今天熟悉了一下规则和蓝桥杯的省赛题,感觉不太习惯,头几道虽然简单,但是一浏览器方式单提交一个数组结果而不是提交代码去跑,感觉韩式有风险的,不知道他们支持提交多少次,要是只能提交一次还真不好做。

下面是一道省赛题,“神奇算式”

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

比如:

210 x 6 = 1260

8 x 473 = 3784

27 x 81 = 2187

都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

问题是比较简单,就是题目不是太清楚,最怕这种了,到时候应该问。就是不知道他左面的乘法式子是只有两数相乘还是可以多数相乘。虽然都是枚举,如果支持多数相乘那考虑的情况就多了,结果也会不一样,他只提交一个数字的话就可能完全与答案不符。

看了一下网上别人的解答都是两数相乘,这里就按左面只有两数做吧。有人是枚举的左边式子里的摸个数,那我就枚举等号右边那个数吧,然后再对右边那个数的因数进行测试就可以了。所谓测试就自己写一个测试函数以a*b=c形式中的a,b,c三个数为参数判断是否符合题目规定的数码要求。

代码:

<span style="font-size:12px;color:#000000;">#include <iostream>
#include<stdio.h>
using namespace std;

bool test(int res,int first,int second)<span style="color:#33cc00;">//测试函数</span>
{
<span style="color:#33cc00;background-color: rgb(255, 255, 255);">//将等式右边数码放入数组
</span>    int flag[4];
for(int i=0;i<4;i++)
{
flag[i]=res%10;
res=res/10;
}
<span style="color:#33cc00;">//有重复数字则不和
</span>    for(int i=0;i<4;i++)
{
for(int j=i+1;j<4;j++)
{
if(flag[i]==flag[j])
return false;
}
}

<span style="color:#33cc00;">//将等式左边数码放入数组</span>    </span>
<span style="font-size:12px;color:#000000;">    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)<span style="color:#33cc00;">//长度不为4则不和</span>
{
return false;
}else
{
<span style="color:#33cc00;">//不得有重复数组</span>
for(int i=0;i<4;i++)
{
for(int j=i+1;j<4;j++)
{
if(flag_2[i]==flag_2[j])
return false;
}
}

<span style="color:#33cc00;">//左边的数码必须在右边出现
</span>        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++)<span style="color:#33cc00;">//枚举所有四位数</span>
{
<span style="color:#33cc00;">//枚举其因数,即左边的情况</span>
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);
}
}
}
}
//cout << "Hello world!" << endl;
return 0;
}
</span>



这里犯了一个错误导致漏掉了一个结果,就是在枚举等号右边的时候原来因为脑子里想着四个数码不同,就将枚举范围定为了1234~9876,没考虑0数码,“6*201=1206”的情况就没出来,后来改成1000~9999就好了,这点时间还是没必要省得,搜全一点是没有坏处的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: