算法竞赛入门经典第二版 2-6排列
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典第二版 2-6排列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 用1,2,3,...,9組成3個三位數abc, def和ghi,每個數字恰好使用一次,要求abc:def:ghi = 1:2:3。按照"abc def ghi"的格式輸出所有解,每行一個解。提示:不必太動腦筋。
原理是遍歷所有數字再進行篩選,優點是簡單容易實現,缺點是程序計算的時間較長。
#include <stdio.h> #define A 100 #define B 999 //題目:輸出[1,9]其中三位組成的三位數,abc,def,ghi,每個數字恰好使用一次,并且要求abc:def:ghi=1:2:3。 int main(void) {int i,j,k,n,m,boo_l=1; //數1,數2,數3,用于循環賦值,用于循環賦值//boo_l用來假定每一個數都是滿足條件的,在往后的判斷中,不符合條件的數只要改變的boo_l的值就很容易讓程序知道這個數符不符合條件 int count[10][2]; //用于計算[0,9]出現的次數 for(i=A;i<=B;i++) //有三個數字,所有三個循環 for(j=A;j<=B;j++)for(k=A;k<=B;k++){ for(n=0;n<=9;n++){ //初始化計數器,用來篩選帶有重復數字的數 count[n][1]=n; //比較對象 count[n][2]=0; //計數器 }if(2*i == j && 3*j==2*k && 3*i == k){ //判斷條件1 for(m=0;m<=9;m++){ //用于統計i中[0,9]出現的次數 if(i/100==count[m][1])count[m][2]++;if(j/100==count[m][1])count[m][2]++;if(k/100==count[m][1])count[m][2]++;}for(m=0;m<=9;m++){ //同上 if(i/10%10==count[m][1])count[m][2]++;if(j/10%10==count[m][1])count[m][2]++;if(k/10%10==count[m][1])count[m][2]++;}for(m=0;m<=9;m++){ //同上 if(i%100%10==count[m][1])count[m][2]++;if(j%100%10==count[m][1])count[m][2]++;if(k%100%10==count[m][1])count[m][2]++;}for(m=0;m<=9;m++){ //判斷并排除帶有重復數字的數 if(count[m][2]>1){boo_l=0;break;} }if(boo_l){ //輸出滿足條件的數字 printf("boo_l=%d %d %d %d\n",boo_l,i,j,k);}boo_l=1; //重置boo_l的數值 }} return 0; }? ? ? ? 反思:過程中用了數組,按照正常的章節進度,這個問題可以不使用數組解決,在輸出符合條件的數字上浪費了過多的調試時間,沒有很好的理解嵌套循環的原理已經其中語句的執行方式。
總結
以上是生活随笔為你收集整理的算法竞赛入门经典第二版 2-6排列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】朴素贝叶斯介绍及实例--对短
- 下一篇: MATLAB2016b 下载和安装(亲测