问题描述:
难点:
1.从n个数选择x个数进行全排列。
解决方法:递归,分治解决。
2.判断两个数数字的组合是否为 唯一的1~9
java代码:
1 import java.util.Scanner; 2 3 4 5 public class Main { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 while(true){ 10 System.out.print("请输入ans:"); 11 Scanner scan=new Scanner(System.in); 12 int ans =scan.nextInt(); 13 Division_Problem problem=new Division_Problem(ans); 14 problem.solve(); 15 System.out.println(); 16 } 17 18 } 19 20 } 21 22 class Division_Problem{ 23 24 int ans; 25 Division_Problem(){}; 26 Division_Problem(int ans){this.ans=ans;} 27 void solve(){ 28 int[][] solveSpace=A(5);//问题解空间 29 int i,j,k; 30 int denominator;//分母 31 int numerator; 32 for(i=0;i<solveSpace.length;i++){//对解空间进行遍历 33 denominator=0; 34 int len=solveSpace[i].length; 35 for(j=len-1;j>=0;j--){ 36 int tmp=solveSpace[i][j]* (int) Math.pow(10.0, (double)(len-1-j)) ; 37 denominator+=tmp; 38 } 39 numerator=denominator*ans; 40 if(isDistinct(numerator,solveSpace[i])){ 41 //构造分母的字符串 42 String str=new String(""); 43 for(j=0;j<solveSpace[i].length;j++){ 44 str+=String.valueOf(solveSpace[i][j]); 45 } 46 System.out.println(numerator+"/"+str+"="+ans); 47 } 48 49 } 50 } 51 boolean isDistinct(int numerator,int[] denominator){//分子、分母 52 boolean isUsed[]=new boolean[10]; 53 int i; 54 for(i=0;i<10;i++) isUsed[i]=false; 55 for(i=0;i<denominator.length;i++){ 56 isUsed[denominator[i]]=true; 57 } 58 int[]numeratorArr=new int[10];//将分子变成字符串 59 int start=9; 60 int rank=1; 61 while(numerator>0){ 62 int tmp=numerator%10; 63 numerator/=10; 64 numeratorArr[start]=tmp; 65 start--; 66 rank++; 67 } 68 int a; 69 a=0; 70 if(start==5){ 71 start--; 72 numeratorArr[start]=0;//高位补上0 73 } 74 if(start==4){ 75 for(i=start+1;i<10;i++){ 76 if(isUsed[numeratorArr[i]]){ 77 return false; 78 } 79 isUsed[numeratorArr[i]]=true; 80 } 81 for(i=0;i<10;i++) 82 if(!isUsed[i]) 83 return false; 84 }else return false; 85 return true; 86 } 87 private int[][] A(int rank){ 88 int[][] re; 89 if(rank>0){ 90 boolean isUsed[]=new boolean[10]; 91 int[][] parent=A(rank-1); 92 int len=parent.length; 93 if(len<=0) len=1; 94 int row=(11-rank)*len; 95 int col=rank; 96 re=new int[row][col]; 97 int i,j,k; 98 int index=0; 99 for(i=0;i<len;i++){ 100 //对于每一行父表,统计有哪些元素没有使用过 101 for(j=0;j<10;j++)isUsed[j]=false; 102 for(j=0;j<rank-1;j++)isUsed[parent[i][j]]=true; 103 for(j=0;j<10;j++){ 104 if(!isUsed[j]){ 105 for(k=0;k<rank-1;k++){ 106 re[index][k]=parent[i][k]; 107 }//拷贝父表 108 re[index][rank-1]=j; 109 index++; 110 } 111 } 112 } 113 }else{ 114 re=new int[0][0]; 115 } 116 return re; 117 } 118 }
输出结果: