问题描述
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;
/**
* @author 作者 : Cactus
* @version 创建时间:2018-3-26 上午07:47:23
* 深搜+全排列
*/
public class Main {
private static int N,count = 0;
private static int[] arrFlag = new int[10];
private static int[] arrNum = new int[10];
static int q = 0;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
sc.close();
dfs(1);
System.out.println(count);
}
private static void dfs(int deep){ //深搜
if(deep == 10){
check(); //完成一套排列组合则检查一下
}else{
for(int i = 1; i <= 9; i++){
if(arrFlag[i] == 0){
arrFlag[i] = 1;
arrNum[deep] = i;
dfs(deep+1);
arrFlag[i] = 0;
arrNum[deep] = 0;
}
}
}
}
/**
* 深搜过程如下:
* 1 2 3 4 5 6 7 8 9
* 检查,然后回退,再赋值
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7
1 2 3 4 5 7 6 8 9
1 2 3 4 5 7 6 9 8
1 2 3 4 5 7 8 6 9
1 2 3 4 5 7 8 9 6
1 2 3 4 5 7 9 6 8
1 2 3 4 5 7 9 8 6
1 2 3 4 5 8 6 7 9
1 2 3 4 5 8 6 9 7
1 2 3 4 5 8 7 6 9
1 2 3 4 5 8 7 9 6
1 2 3 4 5 8 9 6 7
1 2 3 4 5 8 9 7 6
1 2 3 4 5 9 6 7 8
1 2 3 4 5 9 6 8 7
1 2 3 4 5 9 7 6 8
......
*/
private static void check(){
for(int i = 1; i <= 8; i++){
int a = sum(1,i); //得到第一个整数
if(a >= N){
return;
}
for(int j = i + 1; j < 9; j++){
int b = sum(i + 1, j); //得第二数的分子
int c = sum(j + 1, 9); //得第二数的分母
if(c == 0){
continue;
}
if(b > c && b % c == 0 && N == a + b / c){ //判断条件
count++;
}
}
}
}
private static int sum(int a, int b){// 根据arrNum中的部分数值,得到对应的整数
int sum = 0;
for(int i = a; i <= b; i++){
sum = sum * 10 + arrNum[i];
}
return sum;
}
}