问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
cal(0);
System.out.println(count);
}
static int N;
static int n = 9;
static int count;
static int[] iarr = new int[n];
static boolean[] vis = new boolean[n];
static void cal(int p) {
if (p == n) {
// find
String string = "";
for (int i : iarr)
string += i + "";
jud(string);
/*
* System.out.print(string); System.out.println();
*/
} else {
for (int i = 0; i < vis.length; i++) {
if (!vis[i] ) {
vis[i] = true;
iarr[p] = i + 1;
cal(p + 1);
vis[i] = false;
}
}
}
}
static void jud(String string) {
int len = (N + "").length();
for (int i = 0; i <= len; i++) {
int a = Integer.parseInt(string.substring(0, i + 1));
if (a < N)
for (int j = ((9 - i) / 2 + i); j < 9; j++) {
long b = Long.parseLong(string.substring(i + 1, j));
long c = Long.parseLong(string.substring(j));
if (b % c != 0) {
continue;
} else {
if (a + b / c == N) {
count++;
// System.out.println(a+" "+b+" "+c);
}
}
}
}
}
}