题目描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N< 1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入
100
样例输出
11
import java.util.Scanner; public class Main { static int number; //统计次数 static int n; //输入的正整数 public static void main(String[] args) { Scanner sc = new Scanner(System.in); n= sc.nextInt(); int []arr={1,2,3,4,5,6,7,8,9}; dfs(0,arr); System.out.println(number); } public static void dfs(int i,int []arr){ if(i==arr.length-1){//如果找到一种排列组合就检查是否满足 check(arr); return; } for (int j = i; j < arr.length; j++) { //i后的每一位数字都有可能出现在i位置构成一种排序 swap(arr,i,j); dfs(i+1,arr); swap(arr,i,j);//回溯 } } public static void check(int []arr){ //检查整数部分,整数可能1位也可能7位 for (int i = 1; i <=7; i++) { int num1 = toint(arr, 0, i); if (num1 >= n) { continue; } //检查除法部分,分子一定大于分母,后面位数受前面影响 for (int j = 1; j < 9 - i;j++){ int num2=toint(arr,i,i+j); int num3=toint(arr,i+j,9); //分子除以分母一定是整数倍,验证结果是否为n if(num2%num3==0 &&num3!=0 &&num1+num2/num3==n){ number++; } } } } public static int toint(int []arr,int start,int end){ int result=0; int t=1;//乘数因子 for (int i = end-1; i >=start; i--) { result+=arr[i]*t; t*=10; } return result; } public static void swap(int[] arr,int i,int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }