【问题标题】:Udacity Intro to computer science: Lesson 7 Exercise 2Udacity 计算机科学简介:第 7 课练习 2
【发布时间】:2018-08-29 15:09:54
【问题描述】:

这就是我如何回答下面的问题。我该如何更好地解决这个问题?

**

定义一个过程,stamps,它的输入是一个正数 以便士为单位的整数并返回 5p、2p 和 1p 邮票的数量(p 是 便士)来弥补该价值。返回值应该是 三个数字的元组(也就是说,您的 return 语句应该是 其次是5p的数量、2p的数量、1p的数量 邮票)。您的答案应使用尽可能少的总邮票 首先使用尽可能多的 5 便士邮票,然后使用 2 便士邮票和 最后根据需要加盖1便士,补足总。 (对美国人来说不公平 只是说使用“永远”印章并完成它!)

**

这是我的解决方案

def stamps(i):
    # Your code here
    five = 0
    two = 0
    one = 0
    while i > 0:
        if i == 0:
            break
        if i >= 5:
            five = five + 1
            i = i - 5
        if i == 0:
            break
        if i < 5 or i == 2:
            two = two + 1
            i = i - 2
        if i == 0:
            break
        if i < 2 or i == 1:
            one = one + 1
            i = i - 1
    return five,two,one

这是练习中的测试

print stamps(8)
#>>> (1, 1, 1)  # one 5p stamp, one 2p stamp and one 1p stamp
print stamps(5)
#>>> (1, 0, 0)  # one 5p stamp, no 2p stamps and no 1p stamps
print stamps(29)
#>>> (5, 2, 0)  # five 5p stamps, two 2p stamps and no 1p stamps
print stamps(0)
#>>> (0, 0, 0) # no 5p stamps, no 2p stamps and no 1p stamps

【问题讨论】:

  • 如果代码有效,那么问题是可能(参考他们的指南)更适合 codereview.stackexchange.com。如果代码不起作用,您需要具体说明预期结果与实际结果的不同之处。
  • 好的,谢谢。该代码有效。作为一个新手,只是想知道如何才能更好地编写代码。我会考虑在 codereview.stackexchange.com 上发布它

标签: python computer-science


【解决方案1】:

我会使用模数和余数运算:

def modulo_and_remainder(a, b):
    return a//b, a %b

def stamps(a):
    five, rem = modulo_and_remainder(a, 5)
    two, one = modulo_and_remainder(rem, 2)
    return five, two, one

或者(甚至不知道这个)你可以使用内置的 divmod:

def stamps(a):
    five, rem = divmod(a, 5)
    two, one = divmod(rem, 2)
    return five, two, one

【讨论】:

  • +1,虽然已经有一个内置函数 divmod 可以完成您对 modulo_and_remainder 所做的操作。
【解决方案2】:

为了使这个更通用一点,一个函数接受一个标记类型的元组:

def stamps(postage_cost,stamps):
        stamps_required = []
        for stamp in stamps:
            (num_stamps,remainder) = divmod(postage_cost,stamp)
            stamps_required.append(num_stamps)
            postage_cost = remainder
        return tuple(stamps_required)

stamp_types = (5,2,1)
required = stamps(8,stamp_types)
print(required)

【讨论】:

    【解决方案3】:

    def stamps(x): return (x / 5, (x - x / 5 * 5) / 2, x - (x / 5 * 5 + (x - x / 5 * 5) / 2 * 2))

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案4】:

    对于将来可能会发现这一点的人,我觉得所提供的解决方案似乎对初学者不是特别友好,因为这是一门 CS101 课程。

    鉴于当时可用的工具,我相信这是 Udacity 正在寻求指导您的解决方案。至少,这是我作为一个完整的编程初学者想出的答案。

    def stamps(x): # Your answer should use as few total stamps as possible
    five = 0
    two = 0
    one = 0
    while x > 0:
        if x == 0:
            break
        while x >= 5: # Maximizes usage of 5 pence stamps
            five = five + 1
            x = x - 5
        while x >= 2: # Maximizes usage of 2 pence stamps
            two = two + 1
            x = x - 2
        if x >= 1: # The remainder
            one = one + 1
            x = x - 1
    return (five, two, one)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多