泊松分酒问题

描述

著名数学家研究过一个有趣的数学问题:某人有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

倒酒的规则如下:

(1)按a→b→c→a的顺序倒酒。

(2)b倒空后才能从a中取。

(3)c装满后才能向a中倒。

输入

依次输入,满瓶的容量 ,第一个空瓶的容量 ,第二个空瓶的容量 ,平分后每个杯子中的品脱数

输出

>> The division steps are as follows.

Bottle:    a<12> b<8> c<5>

-----------------------------

Step No.|

<0>   |   12    0    0

<1>   |    4    8    0

<2>   |    4    3    5

<3>   |    9    3    0

<4>   |    9    0    3

<5>   |    1    8    3

<6>   |    1    6    5

输入样例 1 

12 8 5 6

输出样例 1

 >> The division steps are as follows.

 Bottle:    a<12> b<8> c<5>
-----------------------------
 Step No.|
   <0>   |   12    0    0
   <1>   |    4    8    0
   <2>   |    4    3    5
   <3>   |    9    3    0
   <4>   |    9    0    3
   <5>   |    1    8    3
   <6>   |    1    6    5
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	int a, b, c,t;
	cin >> a >> b >> c >> t;
	int m, n;
	m = b; n = c;
	int step = 0;
	cout << " >> The division steps are as follows." << endl;
	cout << endl;
	cout << setw(8)<<"Bottle:"<<setw(18)<<"a<12> b<8> c<5>" << endl;
	cout << "-----------------------------" << endl;
	cout << setw(10)<<"Step No.|" << endl;
	b = 0; c = 0;
	while (a != t && b != t && c != t)
	{
		if (step == 0)
		{
			cout << setw(4) << "<" << step << ">" << setw(4) << "|" << setw(5) << a << "  " << setw(3) << b << "  " << setw(3) << c;
			cout << endl;
		}
		if (b == 0)
		{
			a = a - m;
			b = m;
		}
		else if (c == n)
		{
			a = a + n;
			c = 0;
		}
		else if (b > (n - c))
		{
			b -= (n - c);
			c = n;
		}
		else         //b<(n-c) 的情况
		{
			c += b;
			b = 0;
		}
		step++;
		cout << setw(4) << "<" << step << ">" << setw(4) << "|" << setw(5) << a << "  " << setw(3) << b << "  " << setw(3) << c;
		cout << endl;
	}
	return 0;
}

主要想清楚各种情况下做出的判断以及字段宽度的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值