问题描述
把一个数n分解成三个各不相同的正整数之和,并且要求各个正整数都不包含2和4,
一共有多少种分解方法(注意交换 3 个整数的顺序被视为同一种方法,
例如 1000+1001+18 和 1001+1000+18 被视为同一种。) 例: 输入2019 输出:40785
思路
由于题目要求解法不可重复 我们可以人为定义一种规则 比如 a<b<c ;这样就可以避免多次计算同一种解法
完整代码
import java.util.Scanner;
public class Main {
// public static void main(String[] args) {
// Scanner scanner = new Scanner(System.in);
// int n = scanner.nextInt();
// int count = 0;
// for (int i = 1; i <= n; i++) { //外循环确定第一个数
// for (int j = i+1; j <= n && n-i-j > j; j++) { //内循环确定第二个数
// // 且保证第二个数大于第一个数 第三个数(n-i-j)大于第二个数
// int k = n-i-j;
// if( check(i) && check(j) && check(k)){ //写一个方法分别检验得出的三个数字里是否包含2或4
// count++;
// }
// }
// }
// System.out.println(n+"分解为三个不重复的正整数,有"+count+"种情况");
// }
//
// private static boolean check(int number) {
// boolean flag = true;
// while(number > 0){ //对一个数字不断%10 、/10 获取每一位上的数字
// int t = number %10;
// if(t == 2 || t == 4){ //等于2 或4 返回false
// flag = false;
// }
// number /= 10;
// }
// return flag;
// }
public static void main(String[] args) {
int n = 2019;
int num = 0;
for (int i = 1; i < n; i++) {
if ((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1) //将数字化为字符串形式 在其中寻找2或4
continue;
for (int j = i + 1; j < n; j++) {
if ((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1)
continue;
int k = n - i - j;
if (i == k || j == k || i == j || k<=j) //保证三个数各不相同 且大小递增
continue;
if (k > 0 && (k + "").indexOf("2") == -1 && (k + "").indexOf("4") == -1)
num++;
}
}
System.out.println(n+"分解为三个不重复的正整数,有"+num+"种情况");
}
}