Python求解素数问题
author:Starry锐
问题描述:
之前看到一道与素数有关的编程题,我一开始把问题分解为
- 定义一个函数
def is_prime(n):
判断素数并将素数存入list - 用一个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)的题目里边也很常见,就当写个模板吧
后来在面向百度编程的过程中(手动狗头)
发现还有几个比较有意思的思路
- 利用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)
- 涉及时间复杂度,将循环的范围小改,从(2,n-1)到(2,的整数部分),减少了部分循环
由于还没学数据结构,时间复杂度这块就不细说了(我好菜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基础,如有错误请多多包涵,欢迎交流
来源:CSDN
作者:Starry锐
链接:https://blog.csdn.net/qq_45484484/article/details/104044811