带分数
方法一
首先对这10个数字进行全排列,再对全排列后的数中加上+
和/
判断该数是否符合题意。
- 必须要掌握全排列的方法(递归)。
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int ans;
static int n;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 在此输入您的代码...
n = scan.nextInt();
f(0);
System.out.println(ans);
scan.close();
}
// 确认某一个排列的第K位
private static void f(int k) {
if (k == 9) { // 全部确认
check(arr);
// print(arr);
}
// 选定第 k 位
for (int i = k; i < arr.length; i++) {
// 将第 i 位和第 k位交换
int t = arr[i];
arr[i] = arr[k];
arr[k] = t;
// 移交下一层 确认 k+1位
f(k + 1);
// 回溯(换回来)
t = arr[i];
arr[i] = arr[k];
arr[k] = t;
}
}
private static void print(int[] arr) {
// TODO Auto-generated method stub
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
}
// 枚举 + 和 / 的位置
private static void check(int[] arr) {
// + 前的字符数量最多是7
for (int i = 1; i <= 7; i++) {
// / 前面的字符数最少是 i+1
int num1 = toInt(0,i); // + 前面的数字
if (num1 >= n) { // 如果 + 前的数 大于 n 就没有必要再往下算了
break;
}
for (int j = 1; j <= 8-i ; j++) {
int num2 = toInt(i, j);
int num3 = toInt(i+j, 9-i-j);
if (num2 % num3 == 0 && num1 + num2 / num3 == n) {
ans++;
}
}
}
}
private static int toInt(int pos, int len) {
int t = 1;
int ans = 0;
for (int i = pos+len-1; i >= pos; i--) {
ans+=arr[i]*t;
t*=10;
}
return ans;
}
}