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

如何计算小于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:01:14