题目:把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18和 1001+1000+18 被视为同一种。
解题思路+代码:
代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
/**
假定x + y + z = 2019
对 x,y,z !contain(2,4) 记录
核心去重 x < y < z
*/
int n = 2019 ; // 循环枚举
int count = 0; // 记录拆分数字的解法
//去重 x < y < z
for(int x = 1; x<=n; x++){ // 对x进行枚举
if (contain2or4(x)) {
continue;
}
for(int y = x + 1; y<=n - x; y++){ // 对y进行枚举 y 从 x + 1 开始,避免重复
if (contain2or4(y)) {
continue;
}
int z = n - x - y;
if(z>y && !contain2or4(z)){ // z > y 继续避免重复,确保 x < y < z
count++;
}
}
}
System.out.println(count);
}
public static boolean contain2or4(int num){
while(num > 0){
int digit = num % 10; //对参数模运算求数的每一位
if(digit == 2 || digit == 4){ //如果数中包含2或4 返回true
return true;
}
num /= 10; //使所传的数减小 避免死循环
}
return false;
}
}
总结:这道题和数的划分这题很类似,但这道题的解法却与数的划分所用的递归加回溯不一样,使用的是全枚举x,y,计算z。(该题有一定的限制,正整数即需要从1开始,并且需要去重),因此,在for循环枚举时需初始化变量=1,以及枚举去重的核心(x < y < z),再进行过滤(不含2或4),对符合以上要求的x,y,z的组合进行计数,最后输出计数的结果。