不使用mod(%)运算查找100后前10个素数的代码报除以0错误
报错排查与实现方案
代码运行时的核心问题拆解
- 除零错误的直接诱因:Python中
range(150)生成的整数序列从0开始(依次为0、1、2…149),你在循环外写的i=1会被for循环的首次变量赋值直接覆盖,第一次迭代时i=0,执行x/i操作自然触发除以0的报错。 - 等价模运算的实现偏差:你对取余运算的等价逻辑理解有偏差,Python中普通除法
/会返回浮点数,存在精度误差,比如10 /3 *3的结果不是严格等于10,永远没法准确判断整除关系。正确的等价写法应该搭配整数除法//,通过x - i*(x//i) ==0判断余数是否为0,和x%i ==0的效果完全一致。 - 循环逻辑失效:Python的for循环会按照预先定义的序列自动给循环变量赋值,你在循环体里手动修改i值(比如写
i=1、i=i+1)的操作,会在下一次循环迭代时被新的i值覆盖,根本没法按你预想的节奏控制试除范围。 - 素数判断逻辑疏漏:素数的试除不需要从1开始(1和数字本身是天然因数,无需判断),同时你没有设置计数器控制输出数量,没法准确拿到100之后的前10个素数。
修正后的可运行代码
以下代码完全不使用%运算符,可准确实现需求:
# 从100之后的第一个数开始检查 check_num = 101 # 记录已找到的素数数量 found_count = 0 # 存储结果 result = [] # 找到10个素数就停止循环 while found_count < 10: mark_prime = True # 从2开始试除,到数字的平方根位置即可完成判断,无需遍历到x-1 divisor = 2 while divisor * divisor <= check_num: # 用整数除法实现取余判断,完全替代%运算 integer_quotient = check_num // divisor remainder = check_num - divisor * integer_quotient if remainder == 0: # 存在除1和自身外的因数,不是素数 mark_prime = False break divisor += 1 if mark_prime: result.append(check_num) found_count += 1 # 检查下一个自然数 check_num += 1 print("100之后的前10个素数为:", result)
运行效果说明
- 代码运行后会依次输出101、103、107、109、113、127、131、137、139、149,正好是100之后的前10个素数。
- 所有除数变量的初始值为2,全程从根源避免了除零错误。
- 整除判断环节全程没有使用
%运算符,完全符合你的练习要求。
内容的提问来源于stack exchange,提问作者Cinnamon
相关产品推荐
相关产品推荐

