C趣味程序百例(25)波松瓦酒的分酒趣题

文章作者 100test 发表时间 2007:03:10 17:29:48
来源 100Test.Com百考试题网


77.波松瓦酒的分酒趣题
法国著名数学家波瓦松在表年时代研究过一个有趣的数学问题:某人有12品脱的啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,仅有一个8品脱和5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?
*问题分析与算法设计
将12品脱酒 8品脱和5品脱的空瓶平分,可以抽象为解不定方程:
8x-5y=6
其意义是:从12品脱的瓶中向8品脱的瓶中倒x次,并且将5品脱瓶中的酒向12品脱的瓶中倒y次,最后在12品脱的瓶中剩余6品脱的酒。
用a,b,c代表12品脱、8品脱和5品脱的瓶子,求出不定方程的整数解,按照不定方程的意义则倒法为:
a -> b -> c ->a
x y
倒酒的规则如下:
1) 按a -> b -> c ->a的顺序;
2) b倒空后才能从a中取
3) c装满后才能向a中倒
按以上规则可以编写出程序如下:
*程序与程序注释
#include
void getti(int a,int y,int z).
int i. /*最后需要分出的重量*/
void main()
{
int a,y,z.
printf("input Full a,Empty b,c,Get i:"). /*a 满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
scanf("%d%d%d%d",&.a,&.y,&.z,&.i).
getti(a,y,z). /*按a -> y -> z -> a的操作步骤*/
getti(a,z,y). /*按a -> z -> y -> a的步骤*/
}
void getti(int a,int y,int z) /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
{
int b=0,c=0. /* b:第一瓶实际的重量 c:第二瓶实际的重量*/
printf(" a%d b%d c%d\n MMM\n",a,y,z,a,b,c).
while(a!=i||b!=i&.&.c!=i) /*当满瓶!=i或另两瓶都!=i*/
{
if(!b)
{ a-=y. b=y.} /*如果第一瓶为空,则将满瓶倒入第一瓶中*/
else if(c==z)
{ a =z. c=0.} /*如果第二瓶满,则将第二瓶倒入满瓶中*/
else if(b>z-c) /*如果第一瓶的重量>第二瓶的剩余空间*/
{ b-=(z-c).c=z.} /*则将装满第二瓶,第一瓶中保留剩余部分*/
else{ c =b. b=0.} /*否则,将第一瓶全部倒入第二瓶中*/
printf(" M M M\n",a,b,c).
}
}
*运行结果

*思考题
上面的程序中仅给出了两种分酒的方法,并没有找出全部的方法。请设计新的算法,找出全部的分酒方法,并找出一种倒酒次数最少的方法。


相关文章


经典C程序100例==21--30
经典C程序100例==11--20
C趣味程序百例(25)波松瓦酒的分酒趣题
C趣味程序百例(24)10个小孩分糖果
C趣味程序百例(24)小明买书
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛