如何计算小于1000且不含数字3的所有质数之和?
问题排查与修正
你的代码存在两个核心问题,导致无法得到正确结果:
1. 筛选不含数字3的逻辑完全错误
原代码中的条件if not num % 3 and num % 10:是判断num是3的倍数且个位不为0,这和“数字中不包含3”的要求完全不符。比如数字13包含3,但它不是3的倍数,不会被这个条件过滤;而数字30包含3,但因为个位是0,也不会被过滤。
正确的筛选逻辑应该是检查数字的每一位是否包含3,可以通过两种方式实现:
- 转字符串判断:
if '3' in str(num): - 逐位取余判断:循环取数字的个位,检查是否等于3,直到数字变为0。
2. 质数判断的效率可优化(非功能错误,但建议改进)
原代码中判断质数时循环到num,实际上只需要循环到int(num**0.5) + 1即可,因为若num存在大于其平方根的因数,对应的另一个因数必然小于平方根,这样能大幅减少循环次数。
修正后的代码
def has_digit_three(num): # 检查数字是否包含3 if num == 0: return False while num > 0: if num % 10 == 3: return True num = num // 10 return False def primes_sum(lower, upper): total = 0 for num in range(lower, upper): # 小于1000,所以取到999即可,不用upper+1 if has_digit_three(num): continue if num <= 1: continue # 判断是否为质数 is_prime = True for i in range(2, int(num**0.5) + 1): if num % i == 0: is_prime = False break if is_prime: total += num return total total_value = primes_sum(0, 1000) print(total_value)
代码说明
has_digit_three函数专门负责检查数字是否包含3,确保不符合要求的数字被跳过。- 质数判断循环优化到平方根,提升运行效率。
- 循环范围改为
range(lower, upper),因为题目要求“小于1000”,不需要包含1000本身。
内容的提问来源于stack exchange,提问作者regular_everyday_pythonist
相关产品推荐
相关产品推荐

