【问题标题】:The concise 'how many beers' issue?简洁的“多少啤酒”问题?
【发布时间】:2016-01-08 01:12:09
【问题描述】:

我在哪里

我正在计算回收每瓶啤酒后,我可以用 10 元人民币买多少啤酒。对我来说很明显我在程序上做错了什么,但我没有想到那是什么。我目前正在阅读第 9 章的“How To Think Like a Computer Scientist: Think Python”。我觉得这对我来说应该是一个简单的程序,但我不确定如何循环进入应用程序的回收部分。冲洗和重复购买啤酒的最简洁方法是什么?

问题

基本上,一瓶啤酒要 2 元人民币。 2箱1元。 4个盖帽1元。我一开始是10元。我可以买多少啤酒(回收所有的垃圾箱和瓶盖)?

#5 bottles 5 caps 
#= 3 rmb + 1 caps 1 bottles
#6th bottle bought 
#= 2rmb + 2 caps
#7th bottle bought 
#= 0rmb + 3 caps 1 bottles.

import math

def countbeers(rmb):
    beers = 0;
    caps = 0;
    bins = 0;
    bcost = 2;

    for i in range (0,rmb):
        beers += 1/2

    for i in range (0,math.floor(beers)):
        caps += 1
        bins += 1
        rmb = rmb - bcost

    for i in range (0,caps):
        rmb += 1/4

    for i in range (0,bins):
        rmb += 1/2

    #  if rmb > 2  what goes here, trying to loop back through

    return beers

print(countbeers(10))

第二次尝试

#5 bottles 5 caps 
#= 3 wallet + 1 caps 1 bottles
#6th bottle bought 
#= 2wallet + 2 caps
#7th bottle bought 
#= 0wallet + 3 caps 1 bottles.

import math

global beers
global caps
global bins
global bcost

beers = 0
caps = 0
bins = 0
bcost = 2

def buybeers(wallet):
    beers = 0
    for i in range (0,wallet):
        beers += 1/2
        wallet -= 2
    return beers

def drinkbeers(beers):
    for i in range (0,math.floor(beers)):
        caps += 1
        bins += 1
        wallet = wallet - bcost
    return wallet, caps, bins

def recycle(caps, bins):
    for i in range (0,caps):
        wallet += 1/4

    for i in range (0,bins):
        wallet += 1/2

    return wallet

def maxbeers(wallet):
    if wallet > 2:
        buybeers(wallet)

    if math.floor(beers) > 1:
        drinkbeers(beers)

    if caps > 4 | bins > 2:
        recycle(caps, bins)
        return wallet

wallet = int(input("How many wallet do you have?"))

maxbeers(wallet)
if wallet >= 2:
    maxbeers(wallet)
elif wallet < 2: 
    print(beers)

【问题讨论】:

  • 什么是人民币?什么是发行多少啤酒
  • 有点离题,但人民币是什么?
  • 请确保您的代码确实有效。如有必要,使用带有注释的pass 语句,但不要使用if rmb &gt; 2rmb,这是一个语法错误。
  • 我们确实需要更清楚地解决正在解决的问题,RMB 是 Renminbi 或人民币的别称,这是一种最近对美元贬值的货币
  • @evert 感谢您的帮助。我的第二次尝试怎么样?抱歉,代码没有很好地开发,我以为我到了一个停止点,但我没有。

标签: python-3.x program-flow


【解决方案1】:

你的主要问题是你没有循环。您从rmb 购买的每一瓶啤酒都会给您多一瓶,多一瓶。这个新瓶子和瓶盖可能足以让您再赚一个rmb,这可能足以再喝一杯啤酒。您的实现在有限程度上处理了这个问题,因为您多次调用 maxbeers,但如果您给它一卡车啤酒,它不会给出正确的答案,即25656 bottles

如果你知道你有rmb的数量,你可以在纸上手工计算并写下:

def maxbeers(rmb):
    return 7  # totally correct, I promise. Checked this by hand.

但这并不好玩。如果rmb25656 怎么办?

假设我们可以交换:

2 bottles -> 1 rmb
4 caps -> 1 rmb
2 rmb -> 1 beer + 1 cap + 1 bottle

我们这样计算,通过模拟:

def q(rmb):
    beers = 0
    caps = 0
    bottles = 0
    while rmb > 0:
        # buy a beer with rmb
        rmb -= 2
        beers += 1
        caps += 1
        bottles += 1

        # exchange all caps for rmb
        while caps >= 4:
            rmb += 1
            caps -= 4

        # exchange all bottles for rmb
        while bottles >= 2:
            rmb += 1
            bottles -= 2

    return beers

for a in range(20):
    print("rmb:", a, "beers:", q(a))

那我们可以买 20525 瓶啤酒。

【讨论】:

  • 你为什么使用in range(20)?另外,在生成用户输入时,我应该使用yourRMB = input("How much RMB do you have") %% for youRMB in range(20): &amp;&amp; print("rmb:", yourRMB, "beers:", q(a))
  • 运行代码。它会打印一份你可以购买的啤酒清单,给出不同数量的人民币开始。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多