某人有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<stdio.h> int i; /*最后需要分出的重量*/ void getti(int a,int y,int z) { int b=0, c=0; /*b:第一个瓶的实际容量 c:第二瓶的实际容量*/ printf("/n 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); } } main() { int a,y,z; /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/ printf("Input Full a,Empty b,c,Get i: "); 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 操作步骤*/ }