暴力求解 | 除法问题

问题描述:


难点:

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 }

输出结果:

原文地址:https://www.cnblogs.com/TQCAI/p/7693355.html