Python求解素数问题

怎甘沉沦 提交于 2020-01-19 22:21:27

Python求解素数问题

author:Starry锐

问题描述:
在这里插入图片描述
之前看到一道与素数有关的编程题,我一开始把问题分解为

  1. 定义一个函数def is_prime(n):判断素数并将素数存入list
  2. 用一个for循环对符合条件的素数对进行计数

下面说说我是咋想的,一开始我想面向百度编程,直接从网上找现成的判断素数函数,完成第一步。后来找了找发现,好几个网上的函数都有问题,调了半天发现要不是 error 要不就会把一些不是素数的数也放进来。
想了想还是自己写吧

于是。。。我上网复习了一下素数的概念。。。(对不起我菜)
这里用我自己的话来说一下

素数就是除了1和它本身,不能被其他数整除的数

给出我写的判断素数的函数

def is_prime(n):
    p=[2,]#这里要初始化p,由于下边的循环无法将n=2的情况判断为素数,故先加上
    if n<=1:
        p=p
    for i in range(2,n):#这里无法判断n=2时是素数,因为range(2,2)无法迭代
        for j in range (2,i):#j的范围2到i-1
            if i%j==0:
                break#break后边不加;
            if j==i-1:#什么原理??
            #如果j迭代到i-1,即j从2到i-1都无法满足i%j==0,说明i是素数
                p.append(i)        
    return p

再看两遍自己写的代码之后,发现当初写的时候好多细节都没注意,包括变量初始化,函数内的局部变量和全局变量,不过写这个 markdown 的目的就是把自己编程时候踩的坑标注一下,以后尽量注意
另外,素数问题在很多有趣(ku zao)的题目里边也很常见,就当写个模板吧


后来在面向百度编程的过程中(手动狗头)
发现还有几个比较有意思的思路

  1. 利用bool判断素数并计数
#判断是否为素数
def is_prime(n):
    if n<=1 :
        return False;
    for i in range(2,n):
        print(i)
        if n%i==0 :
            return False
    return True

print(is_prime(7))

运行结果如下,它会把每一步i的值打印出来,并最后判断n是否为素数

2
3
4
5
6
True

小改一下,就可打印出[0,n]范围内的素数

#判断是否为素数
def is_prime(n):
    if n<=1 :
        return False;
    for i in range(2,n):
        #print(i)
        if n%i==0 :
            return False
    return True

p=[]
num=int(input())
for i in range(num):
    if(is_prime(i)):
        p.append(i)
print(p)

如果不想放在list里,可直接打印

#判断是否为素数
def is_prime(n):
    if n<=1 :
        return False;
    for i in range(2,n):
        #print(i)
        if n%i==0 :
            return False
    return True


num=int(input())
for i in range(num):
    if(is_prime(i)):
        print(i)


  1. 涉及时间复杂度,将循环的范围小改,从(2,n-1)到(2,n\sqrt n的整数部分),减少了部分循环

由于还没学数据结构,时间复杂度这块就不细说了(我好菜www)

import math

def is_prime(n):
    if n<=1 :
        return False;
    for i in range(2,int(math.sqrt(n))+1):#范围是(2,根号n的取整)
        #print(i)
        if n%i==0 :
            return False
    return True

p=[]
num=int(input())
for i in range(num):
    if(is_prime(i)):
        p.append(i)
print(p)


写在后面:第一次写技术文,灵感来源于自己刷过的题,但在刷题过程中很多细节的问题特别需要注意!!都是自己踩过的坑!写出来希望以后能看看,提醒自己。
对于素数问题,网上的帖子感觉对零基础小白不太友好,本人也是只有一点点Python基础,如有错误请多多包涵,欢迎交流

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!