蓝桥杯_神奇算式

18 篇文章 0 订阅
6 篇文章 0 订阅

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

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

由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就好了,这点时间还是没必要省得,搜全一点是没有坏处的。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值