1. 程式人生 > >枚舉------坑爹的奧數

枚舉------坑爹的奧數

等於 一次 坑爹 d+ 分享圖片 並且 urn alt clas

小哼在數學課上遇到一道奧數題是這樣的,[][][]+[][][]=[][][],將數字1~9分別填入9個[]中,每個數字只能使用一次使得等式成立。例如 173+286=459就是一個和合理的組合,請問一共有多少合理的組合呢? 註意:173+286=459與286+173=459是同一種組合!

方法一:枚舉法(窮去法)

 1 #include <stdio.h>
 2 
 3 /*
 4   有9個方格 三個一組構成一個數字,兩個數相加等於第三個數,這9個數從1~9中選取
 5   且每個數字只能使用一次使得等式成立  例如 173+286=459   
 6   請問一種有多少中合理的組合? 
7 */ 8 9 int main(int argc, char *argv[]) 10 { 11 int a[10],i,total=0; // a[1]~a[9] 表示這9個數 12 for(a[1]=1;a[1]<=9;++a[1]) // 第一個數的百位 13 for(a[2]=1;a[2]<=9;++a[2]) // 第一個數的十位 14 for(a[3]=1;a[3]<=9;++a[3]) // 第一個數的個位 15 for(a[4]=1;a[4]<=9;++a[4]) // 第二個數的百位 16 for(a[5
]=1;a[5]<=9;++a[5]) // 第二個數的十位 17 for(a[6]=1;a[6]<=9;++a[6]) // 第二個數的個位 18 for(a[7]=1;a[7]<=9;++a[7]) // 第三個數的百位 19 for(a[8]=1;a[8]<=9;++a[8]) // 第三個數的十位 20 for(a[9]=1;a[9]<=9;++a[9]) // 第三個數的個位 21 { // 接下來判斷每一位上的數互不相等 22 if(a[1]!=a[2] && a[1]!=a[3] && a[1
]!=a[4] && a[1]!=a[5] && a[1]!=a[6] && a[1]!=a[7] && a[1]!=a[8] && a[1]!=a[9] 23 && a[2]!=a[3] && a[2]!=a[4] && a[2]!=a[5] && a[2]!=a[6] && a[2]!=a[7] && a[2]!=a[8] && a[2]!=a[9] 24 && a[3]!=a[4] && a[3]!=a[5] && a[3]!=a[6] && a[3]!=a[7] && a[3]!=a[8] && a[3]!=a[9] 25 && a[4]!=a[5] && a[4]!=a[6] && a[4]!=a[7] && a[4]!=a[8] && a[4]!=a[9] 26 && a[5]!=a[6] && a[5]!=a[7] && a[5]!=a[8] && a[5]!=a[9] 27 && a[6]!=a[7] && a[6]!=a[8] && a[6]!=a[9] 28 && a[7]!=a[8] && a[7]!=a[9] && a[8]!=a[9] 29 30 && a[1]*100+a[2]*10+a[3] + a[4]*100+a[5]*10+a[6] == a[7]*100+a[8]*10+a[9] ) 31 { 32 total++; 33 printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]); 34 } 35 } 36 37 printf("\ntotal=%d\n\n",total/2); // 因為輸出的有重復的 比如 173+286=459 與 286+173=459是一樣的 38 return 0; 39 }

方法二:標記book[]數組,用來標記互不相等的數,代碼如下:

 1 #include <stdio.h>
 2 int main(int argc, char *argv[])
 3 {
 4     //  算法改進  用book來標記互不相等的數
 5     int a[10],i,total=0,book[10],sum;
 6     for(a[1]=1;a[1]<=9;++a[1])  // 第一個數的百位
 7     for(a[2]=1;a[2]<=9;++a[2])  // 第一個數的十位 
 8     for(a[3]=1;a[3]<=9;++a[3])  // 第一個數的個位
 9     for(a[4]=1;a[4]<=9;++a[4])  // 第二個數的百位
10     for(a[5]=1;a[5]<=9;++a[5])  // 第二個數的十位
11     for(a[6]=1;a[6]<=9;++a[6])  // 第二個數的個位
12     for(a[7]=1;a[7]<=9;++a[7])  // 第三個數的百位
13     for(a[8]=1;a[8]<=9;++a[8])  // 第三個數的十位
14     for(a[9]=1;a[9]<=9;++a[9])  // 第三個數的個位
15     {
16         for(i=1;i<10;++i)   // 初始化book數組
17             book[i]=0;
18         for(i=1;i<10;++i)   // 如果某個數出現過就標記一下 
19             book[a[i]]=1;     
20             
21         // 統計共出現了多少個不同的數
22         sum = 0;
23         for(i=1;i<10;++i)
24             sum+=book[i];
25         // 如果正好出現了9個不同的數,並且滿足等式條件,則輸出
26         if(sum == 9 &&  a[1]*100+a[2]*10+a[3] + a[4]*100+a[5]*10+a[6] == a[7]*100+a[8]*10+a[9])
27         {
28             total++;
29             printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
30         }        
31     } 
32      
33     printf("\ntotal=%d\n\n",total/2); 
34     return 0;
35 }

運行結果如下:

技術分享圖片

枚舉------坑爹的奧數