C趣味程序百例(25)波松瓦酒的分酒趣题
77.博松瓦葡萄酒的葡萄酒划分有趣问题
法国数学家博松在纪年时代研究了一个有趣的数学问题:有人有一个12品脱的啤酒瓶,想从中倒出6品脱,但他没有6品脱的容器,只有一个8品脱的容器和一个5品脱的容器。他怎么能把啤酒分成两个6品脱?
*问题分析及算法设计
将12品脱酒平均分成8品脱和5品脱空瓶,可抽象为求解不定方程:
8x-5y=6
其含义是:将12品脱酒倒入8品脱酒x次,
用a、b、c分别代表12品脱、8品脱和5品脱的瓶子,求不定方程的整数解根据不定方程的含义,反推法为:
a -> b -> c ->a
x y
倒酒的规则如下:[/br]
2) b要倒完才能从A中取空 3) C要倒满才能倒到A中
根据上述规则,程序可以这样写:
*程序和程序注释
/*最后要分离的权重*/
void main()
{
int a,y,z;
printf("input Full a,Empty b,c,Get I:");/*一个满瓶容量Y:第一个空瓶的容量Z:第二个空瓶的容量*/
scanf ("%d% d% d% d ",&a,&y,& I);
getti(a,y,z);/*按a -> y -> z -> a */
getti(a,z,y)的运算步骤;/*按step A-> Z-> Y-> A */
}
void getti(int A,int y,int z)/* A:满瓶容量Y:第一个空瓶的容量Z:第二个/[/k /* b:第一个瓶的实际重量c:第二个瓶的实际重量*/
printf(" A % db % d c % d \ n % 4d % 4d \ n ",A,Y,Z,A,b,c);
while(a!=i||b!=i&&c!=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);
}
}
0条评论