1.贴题

题目来自PythonTip
求解100以内的所有素数


输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格)。


2.说明

很简单粗暴的一道题。知识点整理如下:

  • 判断素数,函数或一般语句均可
  • 100以内,设置循环上限
  • 输出格式要求

3.参考代码

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))) #先将列表中的元素变为字符串再用空格连接输出

4.深入讲解

  • 判断素数的上限最准确的应该使用平方根取整加一,如上面代码所示,但是如果向本题总共就判断到100呢为了简便使用近似的i//2+1即整除2加一也是可以的,验证一下可以发现上限其实是扩大了的(比如根号5=2.23<5/2=2.5)的(根号2根号3进不了循环),所以是不会出错的。
  • 特殊处理很重要,就算是写函数也必须特殊情况特殊讨论
  • 这里有一个else要注意是和for对齐而不是if对齐,如果和if对齐只要不能被2整除就会被添加到列表中了,而且会多次添加。输出会是这样的,感受一下画风吧。。
    2 3 5 7 9 11 11 13 13 15 17 17 17 19 19 19 21 23 23 23 25 25 25 27 29 29 29 29 31 31 31 31 33 35 35 35 37 37 37 37 37 39 41 41 41 41 41 43 43 43 43 43 45 47 47 47 47 47 49 49 49 49 49 51 53 53 53 53 53 53 55 55 55 57 59 59 59 59 59 59 61 61 61 61 61 61 63 65 65 65 67 67 67 67 67 67 67 69 71 71 71 71 71 71 71 73 73 73 73 73 73 73 75 77 77 77 77 77 79 79 79 79 79 79 79 81 83 83 83 83 83 83 83 83 85 85 85 87 89 89 89 89 89 89 89 89 91 91 91 91 91 93 95 95 95 97 97 97 97 97 97 97 97 99
    是不是很有乱码的感觉~
  • 凡是看到“以–区分(最后一个–之后不能–)”这样的要求呢一定要想到使用join语句,否则如果用print的end参数的话还要将最后一个单独拎出来讨论就很累了。(也可以使用strip函数去除空格)

5.大神代码

print(" ".join("%s" % x for x in range(2,100) if not [y for y in range(2,x) if x % y ==0]))

果然python什么都能用一行代码解决。。。
其实还看得不是很懂。。。等以后懂了再来讲解。。

还有 埃拉托斯特尼筛法(Sieve of Eratosthenes)
代码如下

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())