摘要:
波松瓦的分酒趣题
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:某人有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 ca
倒酒的规则如下:
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
波松瓦的分酒趣题(源程序、流程图) 来自淘豆网m.daumloan.com转载请标明出处.