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
问题分析
排除n的逻辑多余且错误:
range(0, arr[x], step)的上限是开区间,本身就不会包含arr[x],所以不需要修改arr[x]的值。比如n=100时,range(0,100,5)会生成到95,自然小于100,无需减1。修改arr[x]反而会导致逻辑冗余。重复计算问题未解决:
同时被3和5整除的数(即被15整除的数)会被sum1和sum2各加一次,导致总和偏大。比如15、30等数,既在被5整除的列表里,也在被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
相关产品推荐
相关产品推荐

