n個數中選取m個數,並全排列

問題描述以下:ios

從下列乘法豎式中,每個星號表明一個數位。若出現的數字有且僅有2,3,5,7四種,你能將此豎式徹底還原嘛?數組

    

答案:775*33 = 25575(2325+23250)ide

進一步,若將題目中的2,3,5,7改成其餘互異的四個數字,還存在要求的乘法豎式嗎?spa

分析:code

該題,利用豎式乘法解決並不困難,主要須要處理的地方是「如何在4位數字中挑選3個數字生成第一個乘數,如何在4位數字中挑選2個數字生成第二個乘數」,而且按照題意,數字的挑選是能夠重複的,也就是容許777這樣的乘數存在。blog

第一種解法:直接用數組模擬整個計算過程。it

 

 1 #include <cstdlib>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int main(){
 7     int number[4] = {2,3,5,7};
 8 
 9     for(int i=0;i<4;i++) {  //遍歷first的第1位,遍歷每一位的可能的取值
10         for(int j=0;j<4;j++ ) {  //遍歷first的第2位,遍歷每一位的可能的取值
11             for(int k=0;k<4;k++){//遍歷first的第3位,遍歷每一位的可能的取值
12                 for(int m=0;m<4;m++){//遍歷second的第1位,遍歷每一位的可能的取值
13                     for(int n=0;n<4;n++){ //遍歷second的第2位,遍歷每一位的可能的取值
14                         int first[3]={0};
15                         int second[2]={0};
16                         int a1[4]={0},a2[4]={0};
17                         int mul_res[5]={0};
18 
19                         int first_temp = number[i]*100+number[j]*10+number[k];
20                         int a1_temp = first_temp * number[m];  //獲得a1的數值
21                         int a2_temp = first_temp * number[n];  //獲得a2的數值
22                         int mul_temp = a1_temp+a2_temp*10;     //獲得mul結果的各位數值
23 
24                         int index1=0,index2=0,index3=0;
25 
26                         while(a1_temp>0){
27                             a1[index1++] = a1_temp%10;
28                             a1_temp = a1_temp/10;
29                         }
30 
31                         while(a2_temp>0){
32                             a2[index2++] = a2_temp%10;
33                             a2_temp = a2_temp/10;
34                         }
35 
36                         while(mul_temp>0){
37                             mul_res[index3++] = mul_temp%10;
38                             mul_temp = mul_temp/10;
39                         }
40 
41                         bool outt = 1;
42                         if(index1!=4||index2!=4||index3!=5) continue;
43                         else{
44                                 //檢測a1中的數字是否都在number中
45                             for(int x=0;x<4;x++){
46                                 if(a1[x]!=number[0]&&a1[x]!=number[1]&&a1[x]!=number[2]&&a1[x]!=number[3] ){
47                                     outt = 0;
48                                     break;
49                                 }
50 
51                             }
52 
53                             //檢測a2中的數字是否都在number中
54                             for(int x=0;x<4;x++){
55                                 if(a2[x]!=number[0]&&a2[x]!=number[1]&&a2[x]!=number[2]&&a2[x]!=number[3] ){
56                                     outt = 0;
57                                     break;
58                                 }
59                             }
60 
61                             //檢測mul_res中的數字是否都在number中
62                             for(int x=0;x<5;x++){
63                                 if(mul_res[x]!=number[0]&&mul_res[x]!=number[1]&&mul_res[x]!=number[2]&&mul_res[x]!=number[3] ){
64                                     outt = 0;
65                                     break;
66                                 }
67 
68                             }
69                         }
70 
71                         if(outt==1){
72                             cout<<number[i]<<number[j]<<number[k];
73                             cout<<"*";
74                             cout<<number[n]<<number[m];
75                             cout<<"=";
76                             for(int w=4;w>=0;w--) cout<<mul_res[w];
77                             cout<<endl;
78 
79                         }
80 
81                     }
82                 }
83             }
84         }
85     }
86 
87     system("pause");
88     return 0;
89 }
數組模擬

 

第二種解法:從7,7,7,5,5,5,3,3,3,2,2,2中選取3個數組成第一個乘數,選取2個數組成第二個數。這就用到了組合數全排列io

相關文章
相關標籤/搜索