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

题目来源:第十届蓝桥杯省赛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;
}
发布了180 篇原创文章 · 获赞 19 · 访问量 5787

猜你喜欢

转载自blog.csdn.net/weixin_43910320/article/details/105231643