[第十届蓝桥杯省赛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;
}

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;
}

posted @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示