波瓦松的分酒趣题

某人有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 操作步骤*/
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值