繁体   English   中英

无法得到 n 以下所有数字的总和可被 3 或 5 整除

[英]Can't get the sum of all numbers below n divisible by either 3 or 5

下面的程序给出了在给定输入数字下可以被 3 或 5 整除的所有数字的总和。 我面临的问题是 n = 100 的总和不正确 output。n = 100 的解应该是 2318,但我的程序给了我 2633。我无法弄清楚这个问题,因为它也给出了n = 10 的右和正确。

    #!/bin/python3

import sys
import math
arr = []
sum1 = 0 
sum2 = 0

t = int(input().strip())

while t < 1 or t > 10**5:
    print()
    t = int(input().strip())

for i in range(t):
    n = int(input().strip())
    arr.append(n)
    
for x in range (0, len(arr)):
    sum1 = 0
    sum2 = 0
 
    for b5 in range (0, arr[x], 5):
        sum1 = sum1 + b5
        
    for b3 in range (0, arr[x], 3):
        sum2 = sum2 + b3
    sum = sum1 + sum2
    print(sum)

编辑:在所有好的反馈之后,我想出了一个想法来排除在原始程序中被添加两次的数字,方法是添加一个 if 语句,如下所示:

for b5 in range (0, arr[x], 5):
    sum1 = sum1 + b5
    if b5%3 == 0:
        sum1 = sum1 - b5
    
for b3 in range (0, arr[x], 3):
    sum2 = sum2 + b3

它不是那么优雅,但我仍然想添加它。

问题在于,这会使既是3 的倍数又是 5 的倍数的数字加倍。

简单的解决方案是从总和中减去这些。

请注意,您的循环有点矫枉过正,因为sum function 可以直接将range表达式作为参数。

所以:

n = 100

total = sum(range (0, n, 5)) + sum(range (0, n, 3)) - sum(range (0, n, 3*5))
print(total)

您可以通过使用三角数公式解决此问题来避免(隐式)循环:

def sum_mul(n, divisor):
    quot = (n - 1) // divisor
    return (quot * (quot + 1) // 2) * divisor

n = 100

total = sum_mul(n, 3) + sum_mul(n, 5) - sum_mul(n, 3*5)
print(total)

优秀的@trincot 答案很聪明 Python。为了完整起见,下面的循环答案显示了您的原始逻辑应该如何构建。

mysum = 0
limit = 100

for x in range(limit):
    if (x % 5 == 0) or (x % 3 == 0):
        mysum += x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM