题目描述:
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入:
从标准输入读入一个正整数N (N< 1000*1000)
输出:
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入:
100
样例输出:
11
参考解答:
import java.util.Scanner;
public class Main {
static int []arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
static int N;
static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
whole_arrangement(0);
System.out.println(count);
}
public static void whole_arrangement(int n) {
if (n == 9) {
match(arr);
}
for (int i = n; i < 9; i++) {
swap(arr, i, n);
whole_arrangement(n+1);
swap(arr, i, n);
}
}
public static void match(int[] arr) {
for (int i = 1; i <= 7; i++) {
int positive_integer = count(0, i);
if (positive_integer >= N) {
break;
}
for (int j = 1; j < 9 - i; j++) {
int num1 = count(i, j);
int num2 = count(i + j, 9 - i - j);
if (num1 % num2 == 0 && positive_integer + num1 / num2 == N) {
count++;
}
}
}
}
public static int count(int index, int length) {
int ten_num = 1;
int num = 0;
for (int i = index + length - 1; i >= index; i--) {
num += arr[i] * ten_num;
ten_num *= 10;
}
return num;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}