问题描述
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 int[] arr = {1,2,3,4,5,6,7,8,9};
private static int n;
private static int cout=0;
//全排列
public static int carm(int l,int k){
int res =0;
for(int i=l;i<k;i++){
res=res*10+arr[i];
}
return res;
}
public static void perm(int[] arr,int q,int p){
if(q==p){
//判断在哪个地方分隔,加号乘号
//加号的位置是从第一个位置到第七个位置
for(int i=1;i<=7;i++){
//计算出jihaodezhengshu
int a=carm(0,i);
//判断整数是否大于被测数
if(a>=n){
continue;
}
//乘号的位置是从加号加一的位置到第八个位置
for(int j=i+1;j<=8;j++){
//分子,j可分为两部分,除去分子就是分母的范围
int fenzi=carm(i,j);
//分母
int fenmu=carm(j,9);
//由于除法有取余的情况,所以换成乘法
if(fenzi+a*fenmu==n*fenmu){
cout++;
}
}
}
}else{
for(int i=q;i<arr.length;i++){
int temp=0;
temp = arr[i];
arr[i]=arr[q];
arr[q]=temp;
perm(arr,q+1,p);
int tt = arr[i];
arr[i]=arr[q];
arr[q]=tt;
}
}
}
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
n = in.nextInt();
perm(arr,0,arr.length);
System.out.println(cout);
}
}