题目描述

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?

注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。

题目解析

这道题目也是一道枚举题,只要枚举每一位数,然后找出满足要求的数中相加等于2019的情况即可,需要特别注意的是,这道题目要求了,三个数交换顺序算同一种情况,因此要避免重复枚举,这里可以用到一个技巧,就是只要保证枚举的三个数$i<j<k$就肯定不会重复。且我们可以在确定了$i$和$j$的值以后,把$k$算出来,这样可以减少一层循环,降低复杂度

代码

#include<iostream>
using namespace std;
bool check(int x)
{
    while(x)
    {
        int t = x % 10;
        if(t == 2 || t == 4) 
            return false;
        x /= 10;
    }
    return true;
}
int main()
{
    int ans = 0;
    for(int i = 1; i <= 2019; i++)
    {
        for(int j = i + 1; j <= 2019; j++)
        {
            int k = 2019 - i - j;
            if(check(i) && check(j) && check(k) && i < j && j < k ) 
                ans++;
        }
    }
    cout << ans << endl;
    return 0;
}