枚舉------坑爹的奧數
阿新 • • 發佈:2018-07-02
等於 一次 坑爹 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 }
運行結果如下:
枚舉------坑爹的奧數