【问题标题】:Sum of all the multiples of 3 or 5 below 10001000以下所有3或5的倍数之和
【发布时间】:2021-11-04 20:23:17
【问题描述】:

这里是初学者-尝试制作一个简单的python程序来计算/回答这个问题:

如果我们列出所有小于 10 且是 3 或 5 倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

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

目前这是我所拥有的:

a = 0
b = 0
while a < 1000:
    a = a + 3
    print (a)

while b < 1000
    b = b + 5
    print (b)

这将打印所有正在考虑的数字。我只需要将它们加在一起,这就是我的答案。

我希望发生两件事中的一件,而不是我编写的代码:

  1. 我希望所有这些都在内部发生,因此不必使用“打印”功能。只需打印所有这些倍数的总和。
  2. 我希望打印所有这些内容,但我也希望能够打印所有这些内容的总和。有没有办法让计算机获取它打印的所有内容的价值?

【问题讨论】:

  • 你为什么要添加到柜台?
  • 即使您将上面打印的数字相加,您也会得到错误的答案,因为您将某些数字计算了两次(例如 15 或 45 或 60),它们是 3 和5.

标签: python


【解决方案1】:

实际上这个问题可以在 O(1) 而不是 O(N) 中解决,而无需使用任何循环或列表:

所需的总和是所有 3 的倍数之和加上所有 5 的倍数之和减去给定数字 1000 (LIMIT=999) 以下 (3*5=15) 的倍数之和。总和计算为算术级数的总和。 可以通过以下方式计算:

LIMIT=999

# Get the upper bounds for the arithmetic series
upper_for_three = LIMIT // 3
upper_for_five = LIMIT // 5
upper_for_fifteen = LIMIT // 15

# calculate sums
sum_three = 3*upper_for_three*(1 + upper_for_three) / 2
sum_five = 5*upper_for_five*(1 + upper_for_five) / 2
sum_fifteen = 15*upper_for_fifteen*(1 + upper_for_fifteen) / 2

# calculate total
total = sum_three + sum_five - sum_fifteen

# print result with Python 3
print(int(total))

结果是:

>>> 
233168

【讨论】:

    【解决方案2】:

    在 Python 中使用 生成器表达式 可以在一行中做到这一点:

    print(sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0))
    

    range(1000) 产生从 0 到 999 的所有整数。对于这些整数中的每一个,如果它可以被 3 整除或被 5 整除,则它包含在结果中。 sum(...) 函数将所有这些数字相加,最后print(...) 打印结果。

    【讨论】:

      【解决方案3】:

      我会使用for 循环来遍历您选择的range 中的每个数字。然后您可以检查模数%是否等于0,即除以这些值时没有余数,如果是,则将其添加到总数中。

      total = 0
      for num in range(1000):
          if num % 3 == 0 or num % 5 == 0:
              print(num)
              total += num
      
      >>> total
      233168
      

      【讨论】:

        【解决方案4】:

        虽然for 循环可以工作,但您也可以使用生成器表达式和sum

        sum(n for n in range(1000) if n % 3 == 0 or n % 5 == 0)
        

        【讨论】:

        • 次要:以上是生成器表达式,而不是列表推导式
        • @GregHewgill - 我只知道足够危险的 Python。除了括号,两者有什么区别?
        • @JustinNiessner:列表推导会创建整个结果列表并将其存储在内存中,然后再继续下一个(求和)步骤。另一方面,生成器表达式动态生成表达式的每个元素,并将它们一个接一个地传递给生成器的消费者(总和)。因此生成器表达式通常比列表推导式更快并且使用更少的内存。
        【解决方案5】:
        def sum_multiply (n):
            data = []
            for num in range (1, n):
                if num % 3 == 0 or num % 5 == 0:
                    data.append(num)
            return sum(data)
        
        sum_multiply(1000)
        

        【讨论】:

        • 只有代码没有解释的答案不是一个好的答案。
        【解决方案6】:
        total=0
        i=0
        while i<1000:
            if i%3==0 or i%5==0:
                print(num)
                total+=i
            i+=1
        print("Total is: ")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-29
          • 1970-01-01
          • 2018-06-06
          • 1970-01-01
          • 2014-07-18
          相关资源
          最近更新 更多