题目: 获取 100 以内的质数。
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。
如:2、3、5、7、11、13、17、19。
一、说明
很简单粗暴的一道题。知识点整理如下:
- 判断素数,函数或一般语句均可
- 100以内,设置循环上限
- 输出格式要求
二、参考代码
2.1 方法一(math库)
import math #导入math库,以便使用里面的一个求平方根的函数
l = [2, 3] #因为range函数上限不能小于下线,所以2,3预先加到素数列表中,直接从5开始(因为知道4不是素数)循环
for i in range(5, 101): #第一层循环,从5到100
for j in range(2, int(math.sqrt(i))+1): #第二层循环,逐个判断是否有因子
if i%j == 0: #如果出现整除说明有因子
break #跳出循环判断下一个
else: #如果第二层循环结束还没有跳出的话
l.append(i) #说明是素数,加到列表里
print(" ".join(map(str, l))) #先将列表中的元素变为字符串再用空格连接输出
2.2 方法二(list列表)
#找出100内所有素数
ls = [];
for i in range(100):
if i < 2:
continue
for j in range(2, i):
if i%j == 0:
#print("{0}不是素数".format(i));
break;
else:
#print("{0}是素数".format(i));
ls.append(i);
print(ls);
2.3、大神代码
print(" ".join("%s" % x for x in range(2,100) if not [y for y in range(2,x) if x % y ==0]))
果然python什么都能用一行代码解决。。。
其实还看得不是很懂。。。等以后懂了再来讲解。。
h = [True] * 100
h[:2] = [False, False]
for i in range(2, int(100 ** 0.5) + 1):
if h[i]:
h[i*i::i] = [False] * len(h[i*i::i])
s=''
for i, e in enumerate(h):
if e:
s += str(i) + ' '
print(s.strip())
三、深入讲解
判断素数的上限最准确的应该使用平方根取整加一,如上面代码所示,但是如果向本题总共就判断到100呢为了简便使用近似的i//2+1即整除2加一也是可以的,验证一下可以发现上限其实是扩大了的(比如根号5=2.23<5/2=2.5)的(根号2根号3进不了循环),所以是不会出错的。
*Reference:
1.资料参考:本文为优快云博主「risuinazoo」
原文链接:https://blog.youkuaiyun.com/weixin_41980474/article/details/80096230
2.来自haotie
可参考判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)
3.菜鸟教程
https://www.runoob.com/python/python-get-prime-number.html