[第十届蓝桥杯省赛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;
}
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人