题目一:每瓶啤酒A元,B个空酒瓶或C个瓶盖可换1瓶啤酒。X元最多可喝多少瓶啤酒?(不可以赊账)
分析: 一个小小的BUG
作者:小不懂
链接:http://www.zhihu.com/question/35726119/answer/69314430
来源:知乎3瓶酒= 3个瓶子 +3个盖子换第一次2个瓶子 换了一瓶。还剩2个瓶子 4个盖子然后 2个瓶子 4个盖子 可以换三瓶啤酒。于是就循环了。得之。只有啤酒就换得完……这规则有BUG
所以我就不考虑可以赊账啊, 瓶盖换空瓶啊之类的
One).最简单的思路就是顺序处理,先买X/A瓶酒,最用酒瓶换,再来用瓶盖换.
衍生出来的价值三元方程式解法
#include<iostream>
using namespace std;
class Peer
{
public:
Peer(int peerPrice = 0, int peerNum = 0, int peerTop = 0, int peerBeerBottle = 0, int money = 0) :PeerPrice(peerPrice), PeerNum(peerNum), PeerTop(peerTop), PeerBeerBottle(peerBeerBottle), Money(money) {}
static void setupone(int n, int m) { PeerTopToPeer=n, PeerBottleToPeer=m; }
void Finally(int a, int e);
private:
int PeerPrice;
int PeerNum;
int PeerTop;
int PeerBeerBottle;
int Money;
static int PeerTopToPeer, PeerBottleToPeer;
};
int Peer::PeerBottleToPeer = 0;
int Peer::PeerTopToPeer = 0;
void Peer::Finally(int a, int e)
{
PeerPrice=a;
Money=e;
do {
PeerNum += (Money / PeerPrice);
PeerTop += (Money / PeerPrice);
PeerBeerBottle += (Money / PeerPrice);
Money = 0;
while ((PeerBeerBottle / PeerBottleToPeer) != 0) {
PeerTop += (PeerBeerBottle / PeerBottleToPeer);
PeerNum += (PeerBeerBottle / PeerBottleToPeer);
PeerBeerBottle = PeerBeerBottle - PeerBeerBottle / PeerBottleToPeer*PeerBottleToPeer + PeerBeerBottle / PeerBottleToPeer;
}
while ((PeerTop / PeerTopToPeer) != 0) {
PeerBeerBottle += (PeerTop / PeerTopToPeer);
PeerNum += (PeerTop / PeerTopToPeer);
PeerTop = PeerTop - PeerTop / PeerTopToPeer*PeerTopToPeer + PeerTop / PeerTopToPeer;
}
} while ((PeerBeerBottle / PeerBottleToPeer) != 0 || (PeerTop / PeerTopToPeer) != 0);
cout << "The number of Peer :" << PeerNum << endl;
}
int main()
{
Peer Q1;
int n, m;
cout << "Please enter your PeerBottleToPeer " ;
cin >> m;
cout << endl;
cout << "Please enter your PeerTopToPeer " ;
cin >> n;
cout << endl;
Q1.setupone(n, m);
int a, b=0, c=0, d=0, e;
cout << "Please enter your PeerPrice " ;
cin >> a;
cout << endl;
cout << "Please enter your money " ;
cin >> e;
cout << endl;
Q1.Finally(a,e);
system("pause");
return 0;
}
设一瓶酒里的酒价值x,酒瓶价值y,瓶盖价值z,随手列个三元一次方程组解得
x+y+z=A: By=A; Cz=A;
解出x,y,z的值,那么问题的关键又到了最后一次还剩下多少瓶盖,瓶身
把剩下的总价值算出来, 求出和初态的差值,这个差值就是酒的价值(price),瓶数就是price/x(其实在简单地分析之后可以得出带2n(n>=1)钱时,最后总会剩下1个瓶身,3个瓶盖)