python利用while循环求2到100内的素数,求大神指点

i = 2
while(i < 100):
   j = 2
   while(j <= (i/j)):
      if not(i%j): break
      j = j + 1
   if (j > i/j) : print(i, end="  ")
   i = i + 1

逻辑有点理不清

# 外层循环 i 从2循环到99
i = 2
while(i < 100):
   # 内层循环 j 从2循环到根号 i
   j = 2
   while(j <= (i/j)): # j <= (i/j) 等效于 j*j <= i 也就等于 j <= 根号 i
      if not(i%j): break #判断如果i可以被j整除,则提前跳出j的循环
      j = j + 1
   #如果j > i/j判断为真表示正常循环结束,i没有被j整除,i是素数。 否则就是提前跳出j循环的,i有被j整除,i不是素数。
   if (j > i/j) : print(i, end="  ")
   i = i + 1

 

# 素数从 2 开始找
i = 2
while(i < 100):
   j = 2
   # 为什么是 j <= i/j 例如 i = 20,那么可能整除的组合就是 2 * 10、4 * 5、5 * 4、10 * 2。可以发现组合是重复的了一次的
   # 所以只要 j <= i/j 就能试完所有的情况
   while(j <= (i/j)):
   	  # 如果找到能整除的,说明不是一个素数,直接 break
      if not(i%j): break
      j = j + 1
   # 如果 j > i/j 说明不是被 break 出来的,那么它是一个素数
   if (j > i/j) : print(i)
   i = i + 1

 

判断一个数n是否是素数,通常从第1个素数2开始,如果n能被2整除,则n不是素数,否则,再用下一个素数3去检验,直到素数大于n的平方根时仍然不能被整除,则n为素数。题主的代码中,j每次递增1而不是使用素数表,存在逻辑漏洞。

下面是根据上述思路写成的代码:

>>> i, prime = 2, [2]
>>> while i < 100:
	is_prime = True # 假设i是素数
	for j in prime: # 遍历素数表
		if not i%j: # 如果i被当前素数整除
			is_prime = False # 则i不是素数
			break # 退出遍历素数表
		elif j > i/j: 如果当前素数大于i的平方根
			break # 退出素数循环
	if is_prime: # 如果i是素数
		prime.append(i) # 则加入素数表
	i += 1 # i加1

	
>>> prime
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

 

如果查找素数的范围不是很大,下面的写法更简洁:

>>> i, prime = 2, [2]
>>> while i < 100:
	for j in prime:
		if not i%j:
			break
	else:
		prime.append(i)
	i += 1

	
>>> prime
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

 

不过,上面的两种写法效率都不高,查找1亿以内的素数,大概20分钟跑不完。要想加速,需要改变思路,同时要用到NumPy。我有篇博客介绍的方法,可以在3秒中找出1亿内的素数,感兴趣可以参考下。https://xufive.blog.csdn.net/article/details/102892049

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

要是求101到200内的素数,直接把数字替换了就不行了,那应该怎么写啊?