题目描述
把 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;
}