[第十届蓝桥杯省赛C++B组]数的分解

本文探讨了第十届蓝桥杯省赛C++B组的一道算法题,目标是将数字2019分解为三个不含2和4的各不相同正整数之和,介绍了枚举算法的优化过程及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:第十届蓝桥杯省赛C++B组

算法标签:枚举

问题描述

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和
1001+1000+18 被视为同一种。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

分解为三个数滚动检测,一开始肯定直接想枚举判断,那么就到n^3的复杂度,201920192019直接爆栈。
我们优化掉一重循环,即c=2019-a-b,此时到了n^2.
又因为 1000+1001+18 和1001+1000+18 被视为同一种。
那么我们将所有逆序都省略,只枚举顺序,即a>b>c.
此时基本可以通过。

题目代码

#include<iostream>

using namespace std;

bool f(int x)//判断是否含2||4
{
    int a=x;

    while(x)
        {
            a=x%10;
            if(a==2||a==4)return false;
            x/=10;
        }
        return true;
}

main ()
{
    int a,b,c,s=0;

    for(int a=3;a<=2018;a++)//a>b>c
    for(int b=2;b<a;b++)
    {
        c= 2019-a-b;
        if(c>0&&c<b&&a!=b&&b!=c&&c!=a&&f(a)&&f(b)&&f(c)&&a+b+c==2019)s++;
    }
    cout<<s;
    return 0;
}

20201011

#include<iostream>
using namespace std;

int ans;

int check(int n){
        while(n){
                if(n%10==2||n%10==4)
                        return 1;
                n/=10;
        }
        return 0;
}

int main(){
        for(int a=1;a<2019;a++)
                for(int b=1;b<a;b++){
                        int c=2019-a-b;
                        if(c<b&&c>=1
                        &&check(a)==0
                        &&check(b)==0
                        &&check(c)==0
                        )
                        ans++;
                }

        cout<<ans;

        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俺叫西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值