問題描述以下: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