目录
题目
100 可以表示为带分数的形式:
还可以表示为:
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<10^6
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
思路
问题求 不重不漏使用 0~9 中的数组成 三个数,要满足 。
可以理解为0~9 如何排列 划分可以满足上述条件。
解决方法:
对 0~9进行全排列 全排列——dfs(剪枝/回溯)-CSDN博客 ,对每个排列好的数通过二重循环来划分成三部分 ,组成 三个数。验证枚举出来的三个数是否满足题干条件,若满足则计数。
代码
import java.util.*;
class Main{
static int N = 1000010;
static int n;
static boolean[] st = new boolean[10]; // 对0~9在全排列过程中做标记
static long l,res;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
n = in.nextInt();
dfs(0); // dfs对0~9进行全排列
System.out.println(res);
}
// 全排列
public static void dfs(int k){ // k计数
if(k==9){ //k==9,排列完成
calculate(l); // 对l进行划分
return;
}
for(int i=1;i<=9;i++){
if(!st[i]){
l = l*10+i;
st[i] = true;
dfs(k+1);
l = l/10;
st[i] = false;
}
}
return;
}
// 将排列的数划分成三部分,判断是否满足条件
public static void calculate(long l){
for(int i=1;i<=7;i++){// 第一部分只能从1~7(7:需要留两个作为后面两部分)
for(int j=i+1;j<9;j++){
long x = l/(int)(Math.pow(10,9-i));
long a = (l%(int)Math.pow(10,9-i))/(int)Math.pow(10,9-j);
long b = l%(int)Math.pow(10,9-j);
if(a/b+x==n&&a%b==0) res++;
}
}
}
}