【多重循环】【流程控制】abc组合(“百文白鸡”穷举法)

在这道题之前,我要先介绍一种经典的问题“百文白鸡”的解法。

问题大致为:鸡翁一只5块,鸡母一只3块,三只鸡雏1块,请问100块可以买多少组合,最终的鸡数必须也是100只。

在C语言中,解决这样情况较多,但是关联点在于钱数加和确定的问题,可以用多重循环来解决。由于我找不到百文白鸡的原题,下面用一个类似的问题来充当引例:

【换硬币问题】
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:
13

输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

已经说过,这类问题分类情况较多,但是关联点在于加和给定,属于“百文白鸡”类型的问题。我们先看代码:

#include<stdio.h>
int main(void)
{
	int a;
	scanf("%d",&a);
	int i,j,k;
	int sum=0,p=0;
  for (i=a/5; i>0; i--)
    {
    	for (j=a/2; j>0; j--)
    	  {
    	  	  for (k=1; k<=a; k++)
    	  	    {
    	  	      	p=k+j*2+i*5;
    	  	      if (p==a)  
					{
					  printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
					  sum++;
					  p=0;
				    }
				  else  p=0;
				}
		  }
	}
	  printf("count = %d",sum);
	  return 0;
 } 
 

整个程序的核心在于一个“三重循环”。

for (i=a/5; i>0; i--)
    {
    	for (j=a/2; j>0; j--)
    	  {
    	  	  for (k=1; k<=a; k++)
    	  	    {
    	  	      	p=k+j*2+i*5;
    	  	      if (p==a)  
					{
					  printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
					  sum++;
					  p=0;
				    }
				  else  p=0;
				}
		  }
	}

观察这段代码,其实不难理解:
如果k+2j+5i加和不满足条件,则最内循环变量k首先递增来迎合当前的j和i。k一轮循环如果还是不满足条件,那么接下来中间循环变量j会递增1,再让内循环k循环一轮……如此反复,必能遍历到所有满足条件的情况。
.
.
.
学会了这样的流程控制方法,我们来看这道题:

【abc组合问题】

问题描述
已知abc+cba=n,其中a,b,c均为一位数,1000<n<2000,编程求出满足条件的a,b,c所有组合。

输入说明
一个整数n

输出说明
按照整数abc从小到大的顺序,输出a, b, c, 用空格分隔,每输出一组a,b,c后换行.

输入样例
1352

输出样例
3 7 9
4 7 8
5 7 7
6 7 6
7 7 5
8 7 4
9 7 3

我们看,这道题也是情况繁多,但是关联点在于abc+cba=n的条件是始终不变的。
那么,我们想,把a、b、c分别最为三层循环的变量,最内循环节的判断语句是abc+cba是否为n,这样就能遍历到所有的情况了!同时我们也发现,这其实也是一道“百文白鸡”类型的题目,只是比较隐晦罢了!
理解到这一步,我们开始写程序吧:

#include<stdio.h>

int judge (int a,int b,int c)
{
	int x;
	int y;
	x=a*100+b*10+c;
	y=c*100+b*10+a;
	return x+y;
}

int main (void)
{
	int x;
	scanf("%d",&x);
	int a,b,c;
  for (a=0; a<=9; a++)
  {
  	for (b=0; b<=9; b++)
  	{
  		for (c=0; c<=9; c++)
  		{
  			if (judge(a,b,c)==x)
  			{
  				printf("%d %d %d\n",a,b,c);
  			}
  		}
  	}
  }
  return 0;
}

以上是“百文白鸡”一类题的小总结,以后还有类似题也会在此做添加。不足之处请多多指正!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值