《算法竞赛入门经典》(第2版)——习题2-6 排列(permutation)

分析:由于题目要求abc:def:ghi=1:2:3,并且每个数字恰好使用一次,所以ghi的最大值应为987,abc的最大值为987/3=329,所以可以缩小abc的范围,abc最小为123,这样可以很大程度的减少遍历次数,具体见代码,有相应的注释。

#include<stdio.h>
int main(){
	int array[9]={0},i,j,k,abc,def,ghi;
	int flag;
	for(i=123;i<=329;i++){
		flag=0;//由于是多次循环,所以每经过一次循环,都要重新赋值
		abc=i;
		def=2*abc;//根据比例,可以将def和ghi都表示出来
		ghi=3*abc;
		//接下来是依次把三个数的每一位都分离出来,放在一个一维数组里
		array[0]=abc%10;array[1]=abc/10%10;array[2]=abc/100;
		array[3]=def%10;array[4]=def/10%10;array[5]=def/100;
		array[6]=ghi%10;array[7]=ghi/10%10;array[8]=ghi/100;
		//判断数组里是否有重复的数字
		for(j=0;j<9;j++){
			for(k=0;k<9;k++)
				if(j==k) //最开始,j和k都是=0的,后面的也是一样,因此要跳过,第一次就栽到这里了。。。
					continue;
				else{
					if(array[j]==array[k]){
						flag=1;break;//一旦找到有重复的数字,立马结束匹配,跳出双重循环
					}
					else continue;
				}
			if(flag==1)//这一步是跳出双重循环的关键哦
				break;
			else continue;
		}
		if(flag==0)
			printf("%d %d %d\n",abc,def,ghi);	
		else continue;
	}
	return 0;
}

这是我看过一些解题思路后,自己敲的,可能有些冗杂,所以有自己的想法也可以试着敲一敲,重要的是思路。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值