问题描述
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
暴力枚举会超时,用dfs+回溯,进行全排列
package cn.lml.lanqiao.www;
import java.util.*;
public class DaiiFenShu {
/**
* @param args
*/
static int kinds=0;
static int a[]=new int[10];
static boolean vis[]=new boolean[10];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
int num=s.nextInt();
dfs(1,10,num);
System.out.println(kinds);
}
public static int sum(int start, int end){
int sum=0;
for(int i=start;i<end;i++){
sum=sum*10+a[i+1];
}
return sum;
}
public static void check(int a[],int n, int num){
int begin=1;
int temp=num;
while((temp=temp/10)!=0){begin++;}
for(int k=1;k<begin+1;k++){
int num1=sum(0,k);
if(num1>num){return;}
for(int j=k+(n-k)/2;j<n-1;j++){
int num2=sum(k,j);
int num3=sum(j,n-1);
if(num2>num3&&num2%num3==0&&num==num1+num2/num3){
//System.out.println(num+"="+num1+"+"+num2+"/"+num3);
kinds++;
}
}
}
}
private static void dfs(int start, int end, int num) {
// TODO Auto-generated method stub
if(start==end){
check(a,end,num);
}
else
{
for(int i=1;i<end;i++){//全排列,深度优先进行排列组合
if(vis[i]){continue;}
a[start]=i;
vis[i]=true;
dfs(start+1,end,num);
vis[i]=false;
}
}
}
}