1596:历届试题 带分数
2018-03-16 23:07
239 查看
//因为之前没有用dfs做过除了二叉树以外题型,本来以为会做一个小时,没想到二十分钟就搞懂而且打出来了,还是不要太高估题目难度了,重要的是坚持。
Description
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
Input
从标准输入读入一个正整数N (N<1000*1000)Output
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。Sample Input
样例输入1 100 样例输入2 105
Sample Output
样例输出1 11 样例输出2 6
import java.util.*; public class Main { static int []ss=new int [10]; static int []flag=new int [10]; static int aws=0; public static int num(int start,int end){ int num=0; for(int i=start;i<end;i++) num=num*10+ss[i+1]; return num; } public static void find(int ss[],int m){ //把dfs中每一个全排列结果放到find函数中检验 int begin=0; for(int i=1;i<10;i++){ int a=num(0,i);//第一个数从1到9开始选 if(a>=m) return; for(int j=i+(10-i)/2;j<9;j++){ int b=num(i,j);//第二个数 int c=num(j,9); if(b>c&&b%c==0&&m==a+b/c) aws++; } } } public static void dfs(int start,int m){ if(start==10) find(ss,m); else{ int i; for(i=1;i<10;i++){ if(flag[i]==1) continue; ss[start]=i; flag[i]=1; dfs(start+1,m);//选好一位就进入下一位 flag[i]=0; } } } public static void main(String[] args){ Scanner sc=new Scanner(System.in); int m=sc.nextInt(); dfs(1,m); System.out.println(aws); } }