泊松趣味数学题某人有12品脱的啤酒,想从中倒出6品脱,可他没有6品脱的容器.只有1个8品脱的容器,和一个5品脱的容器.问

2个回答

  • 问题分析与算法设计

    将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

    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:"); /*a 满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/

    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的步骤*/

    }

    void getti(int a,int y,int z) /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/

    {

    int b=0,c=0; /* b:第一瓶实际的重量 c:第二瓶实际的重量*/

    printf(" a%d b%d c%dn %4d%4d%4dn",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 %4dn",a,b,c);