【问题标题】:Python - sum of multiples of 3 or 5 below 1000Python - 1000 以下 3 或 5 的倍数之和
【发布时间】:2020-07-19 21:52:12
【问题描述】:

问题听起来像这样: “如果我们列出所有小于 10 且是 3 或 5 倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

求 1000 以下所有 3 或 5 的倍数之和。”

我在下面写了一些代码,我很困惑为什么它不起作用

s1 = 0
s2 = 0
for i in range(0,1000,3):
    s1 = s1 + i
for i in range(0,1000,5):
    s2 = s2 + i
suma = s1 + s2
print(suma)

除此之外,我尝试一次将 0 的值分配给所有变量:

suma, s1, s2 = 0
#the rest of the code here

我收到以下错误: TypeError: cannot unpack non-iterable int object

如何一次分配所有内容?我什至需要将每个变量都分配给 0 以使我的代码正常工作,还是类似于 Turbo Pascal,其中每个 int 变量自动分配为 0?

【问题讨论】:

  • s1, s2 = 0, 0
  • 你会以你的方式计算 15、30、45 等的两倍。
  • 我不确定人们对此有何反对意见。你展示了你的工作,很好地格式化了问题,并且有一个可重现的问题。 +1。
  • @theX 你也可以在一行中做多个赋值,如下:suma = s1 = s2 = 0
  • 我想你已经忘记了作为初学者是什么感觉@mkrieger1。现有的代码可能代表了相当多的工作。说它没有显示任何研究努力是很不公平的。

标签: python python-3.x


【解决方案1】:

每次计算每个范围都会计算 5 和 3 的倍数,例如 15 和 30,两次。

执行此操作的更 Python 方法是将范围视为一个序列并过滤掉所有不符合您条件的数字。然后总结顺序。对于 5 或​​ 3(或两者)的倍数,该标准可能如下所示:

n % 3 == 0 or n % 5 == 0

% 产生除以以下数字的余数。对于任何n,只有当它是 5 或 3 的倍数时才成立。您可以使用它来过滤范围和总和:

sum(n for n in range(10) if n % 3 == 0 or n % 5 == 0)
# 23

这是可行的,因为内部位生成了一个只包含您想要的值的迭代器:

[n for n in range(10) if n % 3 == 0 or n % 5 == 0]
# [0, 3, 5, 6, 9]

将其与内置函数 sum() 相加得出正确答案。

另外你得到的错误是因为这种赋值格式试图解压几个值:

a, b, c = [1, 2, 3] # works
a, b, c = 10 # error -- not enough values.

【讨论】:

    【解决方案2】:

    @MarkMeyer 的回答可能是 Pythonic,让我们修复您的原始代码以产生正确的结果。 (并一次将值 0 分配给所有变量。)

    s1 = s2 = s3 = 0
    
    for i in range(0, 1000, 3):
        s1 += i
    
    for i in range(0, 1000, 5):
        s2 += i
    
    for i in range(0, 1000, 3 * 5):
        s3 += i
    
    suma = (s1 + s2) - s3
    
    print(suma)
    

    【讨论】:

    • 感谢您获取我的初始代码并修复它!我对马克的代码有点困惑,但这清除了它。也感谢您向我展示 += 运算符,这将真正清理所有内容,并且我不必再使用诸如 s1=s1+i 之类的古老方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多