算法竞赛入门经典第二版 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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值