波松瓦酒的分酒趣题

法国著名数学家波瓦松在表年时代研究过一个有趣的数学问题:某人有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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值