波松瓦的分酒趣题(源程序、流程图)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:
2. 波松瓦的分酒趣题
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:某人有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 x −−→
b y −−→
c −−
→a
倒酒的规则如下:
1) 按a -> b -> c ->a 的顺序;
2) b 倒空后才能从a 中取
3) c 装满后才能向a 中倒
流程图:
开始 输入三瓶酒a,b,c 的容量分别是12,8,5 a 为满瓶,b ,c 为空瓶 将a 倒入b 瓶中,b 瓶倒满 用b 瓶将c 倒满 将倒满后的c 瓶再倒回a 瓶中 a 瓶的重量是否大于b 瓶的剩余空间? 将a 瓶全部装入b 瓶中 是否有瓶里的量为6? 输出a ,b ,c 瓶的容量情况 结束
Y N Y N
源程序
#include
void Pourer(int a,int y,int z) /*a:满瓶的容量y:第一个空瓶的容量z:第二个空瓶的容量*/ {
int b=0,c=0,i=6;/* b:第一瓶实际的盛酒量c:第二瓶实际的盛酒量*/
printf("倒酒的过程如下:(a,b,c下面的数字分别表示当前瓶内的酒量)\n\n");
printf(" a(%d) b(%d) c(%d)\n %4d %4d %4d\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(" %4d %4d %4d\n",a,b,c);
}
}
void main()
{
int a,b,c;
a=12;b=8;c=5;/*a 代表盛酒瓶容量;b和c代表空瓶容量*/
Pourer(a,b,c); /*按a -> b -> c -> a 的操作步骤*/
}