Python作业求助:求45以内素数乘非素数且积小于45的结果,禁用数组、函数
问题排查
你的第二版代码没有输出是因为存在以下几个核心错误:
- 布尔标记被强制覆盖:素数判断逻辑执行完成后,你手动写了
n = True直接覆盖了之前的所有判断结果,导致所有数都被判定为素数,后续筛选非素数的if not n == True条件永远无法触发,自然没有输出。 - 标记变量未正确初始化:每次判断新的数值是否为素数前,没有给标记变量设置初始值,会残留之前的判断结果,导致当前判断逻辑错误。
- 素数判断的循环边界错误:
range(2, int(sqrt(num)))是左闭右开区间,会漏掉等于平方根的因数,需要改为range(2, int(sqrt(num)) + 1)才能覆盖所有可能的因数。 - 非素数判断逻辑错误:1不属于素数,你没有单独处理1的情况,会导致1被错误判定为素数。
修正后可运行代码
from math import sqrt # 遍历2~45筛选素数(素数定义为大于1的自然数) for prime in range(2, 46): is_prime = True # 素数判断逻辑 for i in range(2, int(sqrt(prime)) + 1): if prime % i == 0: is_prime = False break # 不是素数就跳过后续乘积计算 if not is_prime: continue # 遍历1~45筛选非素数 for not_prime in range(1, 46): is_not_prime = False # 1默认属于非素数 if not_prime == 1: is_not_prime = True else: # 大于1的数判断是否为合数 for j in range(2, int(sqrt(not_prime)) + 1): if not_prime % j == 0: is_not_prime = True break # 乘积小于45就打印 if is_not_prime and prime * not_prime < 45: print(prime, '*', not_prime, '=', prime * not_prime)
代码说明
- 全程仅使用基础循环、判断语法,未使用数组、自定义函数,符合作业要求
- 单独处理了1的非素数属性,逻辑符合素数定义
- 每个数值判断前都重新初始化布尔标记,不会出现判断结果残留的问题
- 素数判断循环边界调整为平方根+1,不会漏掉因数判断
内容的提问来源于stack exchange,提问作者Frilled Shrimpo
相关产品推荐
相关产品推荐

