题目
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
思路
最简单的思路就是暴力枚举法,也是一道填空题,所以代码超时也没关系,提交答案即可。按照题目要求进行判断,由于不能出现重复,a=b,a=c,b=c,同时也要保证a,b,c三个的位置互换可能会有六种情况。因此最简单的思路就是第一次循环从1-n,第二次循环从上一次循环+1开始到n,第三次是第二次+1到n,保证了位置上的无重复。当然你也可以全部列出来然后统一处以6,至于为什么除6,可以考虑一下概率论的知识,三个位置三个球一共几种摆法,也就是3×2×1=6。
代码
// 1464: [蓝桥杯2019初赛]数的分解
#include <iostream>
using namespace std;
bool judge(int num){
while(num){
int tmp = num % 10;
if(tmp == 2 || tmp == 4){
return true;
}
num /= 10;
}
return false;
}
bool check(int a, int b, int c) {
// 有数字出现 2 和 4,或者出现重复数字,返回 0
if (judge(a) || judge(b) || judge(c) ||
a == b || a == c || b == c) {
return false;
}
return true;
}
int main(){
int n = 2019;
int count = 0;
for(int i = 1; i < n - 1; i++){
for(int j = i + 1; j < n - 1; j++){
for(int k = j + 1; k < n - 1; k++){
if(i + j + k == n){
count += check(i, j, k);
}
}
}
}
cout<<count;
return 0;
}