描述
著名数学家研究过一个有趣的数学问题:某人有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;
}
主要想清楚各种情况下做出的判断以及字段宽度的问题。