法国著名数学家波瓦松在表年时代研究过一个有趣的数学问题:某人有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>
void getti(int a,int y,int z);
int i;
int main()
{
int 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);
getti(a, z, y);
return 0;
}
void getti(int a,int y,int z)
{
int b = 0, c = 0;
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)
{
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);
}
}