蓝桥杯题目练习 基础篇 [蓝桥杯2019初赛]数的分解

[蓝桥杯2019初赛]数的分解

题目描述

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

代码

方法一:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;

bool check(int n)
{
    stringstream ss;
    ss << n;
    string t;
    ss >> t;
    bool f = true;
    for(int i = 0; i < t.length(); ++i)
    {
        if(t[i] == '2' || t[i] == '4')
        {
            f = false;
            break;
        }
    }
    return f;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);


	int ans = 0;
    for(int i = 1; 3*i <= 2019; ++i)
    {
        for(int j = i+1; i+j*2 <= 2019 ; ++j)
        {
            int k = 2019 - i - j;
            if(k <= j)
                continue;
            if(check(i) && check(j) && check(k))
            {
                ans ++;
            }
        }
    }
    cout << ans;
	return 0;
}

方法二

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int num[1000001];
bool vis[1000001],flag;
bool check(int x){
	while(x!=0){
		if(x%10==2 || x%10==4){
			return true;	
		}
		x=x/10;
	}
	return false;
}
int main() {
	int n;
	int x,sum=0;
	bool flag=false;
	for(int i=1;i<=2019;i++){
		for(int j=i+1;i+j*2<=2019;j++){
			int k=2019-i-j;
			flag=false;
			if(k<=0) continue;
			if(k<=j) continue;
			if(!check(i) && !check(j) && !check(k)){
				sum++;
			}
		}
	}
	cout<<sum;
	return 0;
}

答案是:40785

发布了149 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104785107