生活中的数学问题(一)

题目一:每瓶啤酒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个瓶盖)

—————————————————————————


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值