暴力dfs带分数问题Java版本
题目描述
100 可以表示为带分数的形式:
还可以表示为:
注意特征:带分数中,数字 1~9分别出现且只出现一次(不包含 00)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1~9不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<10^6
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
分析
枚举1~9的数字存放至res数组中,将所有排列组合出来,然后将该排列划分成3部分,未避免溢出采用ac+b==nc等式判断来代替除法中有可能产生的浮点数。
import java.util.Scanner;
public class Main {
static int N = 30;
static int n;
static boolean[] st = new boolean[N];
static int[] res = new int[N];
static int ans=0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
dfs_a(0);
System.out.println(ans);
}
private static void dfs_a(int u) {
if (u == 9) {
for (int i = 0; i < 7; i++) {
for (int j = i+1; j < 8 ; j++) {
int a=malc(0,i);
int b=malc(i+1,j);
int c=malc(j+1,8);
if (a*c+b==n*c)
{
ans++;
}
}
}
}
for (int i = 1; i <= 9; i++) {
if (!st[i]) {
st[i] = true;
res[u]=i;
dfs_a(u+1);
st[i] = false;
}
}
}
static int malc(int x,int y){
int r=0;
for (int i = x; i <=y ; i++) {
r=r*10+res[i];
}
return r;
}
}