You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环计算n以下可被3和5整除的数的总和:报错与异常排查

问题解答:计算小于n且可被3或5整除的数的总和

问题1:嵌套for循环传参与语法错误

需求是编写Python程序,输出所有小于n的、可被3和5整除的数的总和。初始代码尝试用嵌套for循环按指定步长遍历累加,但代码无法运行。

初始代码

#!/bin/python3

import sys
import math
arr = []
arr3 = []
arr5 = []
tn = 1
sum1 = 0 
sum2 = 0

t = int(input("How many test cases do you have? ").strip())

while t < 1 or t > 10**5:
    print("go again, the number is not in the range")
    t = int(input("How many test cases do you have? ").strip())

for i in range(t):
    n = int(input("What number do you want to test? ").strip())
    arr.append(n)
    
for x in range (0, len(arr)):
    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)

问题分析与修复

代码无法运行的核心原因是语法错误:

  • 两个for循环语句末尾缺少冒号:
  • range调用的括号没有正确闭合

另外,sum1和sum2没有在每次处理新测试用例时重置,会导致不同测试用例的结果累加在一起,造成错误。修复后的基础版本如下:

#!/bin/python3

arr = []
sum1 = 0 
sum2 = 0

t = int(input("How many test cases do you have? ").strip())

while t < 1 or t > 10**5:
    print("go again, the number is not in the range")
    t = int(input("How many test cases do you have? ").strip())

for i in range(t):
    n = int(input("What number do you want to test? ").strip())
    arr.append(n)
    
for x in range(len(arr)):
    sum1 = 0  # 每次处理新测试用例时重置
    sum2 = 0
    # range(0, arr[x], 5) 本身就生成小于arr[x]的数,无需额外处理
    for b5 in range(0, arr[x], 5):
        sum1 += b5
    for b3 in range(0, arr[x], 3):
        sum2 += b3
    # 减去同时被3和5整除的数的和(避免重复计算)
    sum_both = 0
    for b15 in range(0, arr[x], 15):
        sum_both += b15
    total = sum1 + sum2 - sum_both
    print(total)

问题2:排除n本身与总和异常

修改代码后尝试排除n本身(要求数必须小于n),但测试数值100时,输出出现重复的0、5序列,且总和异常。

修改后代码

#!/bin/python3

import sys
import math
arr = []
arr3 = []
arr5 = []
tn = 1
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
    mo5 = arr[x]%5
    mo3 = arr[x]%3
    if mo5 == 0 or mo3 == 0:
        arr[x] = arr[x]-1
 
    for b5 in range (0, arr[x], 5):
        sum1 = sum1 + b5
        print(b5)
    for b3 in range (0, arr[x], 3):
        sum2 = sum2 + b3
    sum = sum1 + sum2

问题分析

  1. 排除n的逻辑多余且错误:
    range(0, arr[x], step)的上限是开区间,本身就不会包含arr[x],所以不需要修改arr[x]的值。比如n=100时,range(0,100,5)会生成到95,自然小于100,无需减1。修改arr[x]反而会导致逻辑冗余。

  2. 重复计算问题未解决:
    同时被3和5整除的数(即被15整除的数)会被sum1和sum2各加一次,导致总和偏大。比如15、30等数,既在被5整除的列表里,也在被3整除的列表里,必须减去它们的和一次。

  3. 输出重复序列的原因:
    代码中在for b5循环里加入了print(b5),所以每次处理测试用例时都会打印所有被5整除的数,当有多个测试用例时就会出现重复的0、5...序列。

优化修复版本

对于大量测试用例(比如t=1e5),循环累加效率极低,推荐用数学公式直接计算,时间复杂度为O(1):

#!/bin/python3

def calculate_sum(n):
    # 计算小于n的最大k的倍数的和:k * m*(m+1)//2,其中m=(n-1)//k
    def sum_multiples(k):
        m = (n - 1) // k
        return k * m * (m + 1) // 2
    sum3 = sum_multiples(3)
    sum5 = sum_multiples(5)
    sum15 = sum_multiples(15)  # 减去重复计算的部分
    return sum3 + sum5 - sum15

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

for _ in range(t):
    n = int(input().strip())
    print(calculate_sum(n))

内容的提问来源于stack exchange,提问作者Pascal Barthelmäs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:10:40