算法竞赛入门经典第二版 2-6排列

来源:互联网 发布:应届毕业生简历 知乎 编辑:程序博客网 时间:2024/05/22 06:24

        用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;}

        反思:过程中用了数组,按照正常的章节进度,这个问题可以不使用数组解决,在输出符合条件的数字上浪费了过多的调试时间,没有很好的理解嵌套循环的原理已经其中语句的执行方式。

阅读全文
0 0