如何扩展Python循环中用作范围的数组?质数程序问题求助
解决100以内质数查找程序的问题
首先你的代码存在几个核心逻辑错误,同时也有你提到的循环范围固定的问题,下面一步步修正:
1. 修正基础逻辑错误
- 初始值错误:1不是质数,
primes应该从[2]开始(2是最小的质数) - 第二层循环的无效跳过:你写了
if j != 0: continue,导致第二层循环永远只执行j=0的情况,根本没遍历已发现的质数来判断整除性 - 判断条件矛盾:前面已经跳过了j≠0的情况,后面的
if j != 0 and ...永远不会触发,自然不会往primes里加新元素
2. 解决循环范围固定的问题
你提到的range(len(primes))会固定初始长度的问题,根本不需要用numpy,直接遍历primes列表本身,或者用while循环动态检查即可。另外判断质数时可以做个优化:只需要检查到该数的平方根(如果i有大于sqrt(i)的因数,对应的另一个因数必然小于sqrt(i)),能大幅减少循环次数。
修正后的代码
def Primeadder(): primes = [2] # 初始质数从2开始 for i in range(3, 100): # 从3遍历到99 is_prime = True # 遍历已发现的质数,检查是否能整除i for p in primes: # 优化:当前质数平方大于i时,无需继续检查 if p * p > i: break if i % p == 0: is_prime = False break if is_prime: primes.append(i) print(primes) Primeadder()
代码说明
- 初始
primes设为[2],符合质数定义 - 外层循环从3开始,因为2已经在列表里了
- 内层循环直接遍历
primes中的每个质数,不需要依赖索引,自然避开了range长度固定的问题 - 平方根优化减少了不必要的循环,提升了效率
如果一定要用索引方式解决range长度固定的问题,可以把内层循环改成while循环:
def Primeadder(): primes = [2] for i in range(3, 100): is_prime = True j = 0 while j < len(primes): p = primes[j] if p * p > i: break if i % p == 0: is_prime = False break j += 1 if is_prime: primes.append(i) print(primes)
这里用while j < len(primes)动态判断循环条件,就能随着primes长度变化调整循环次数。
内容的提问来源于stack exchange,提问作者Yodamustibe
相关产品推荐
相关产品推荐

