方法一:最基本的比较方法,就是基于判断一个数字n是否有除了1和自己以外的约数,如果没有,则这个数字是质数;实现方法如下:
n=int(input(">>>")) #输入一个数字
for i in range(2,n+1):
if a % i == 0: #从2开始比较,如过能整除,说明不是质数
break
if a==i:
print("YES") #一直进行到数字n,都没有整除,则是质数
else:
print(" NO")
#或者用三元表达式:
n=int(input(">>>")) #输入一个数字
for i in range(2,n+1):
if a % i == 0: #从2开始比较,如过能整除,说明不是质数
break
print("YES") if a == i else print(" No") #一直进行到数字n,都没有整除,则是质数
测试结果:
方法二:基于第一种情况,计算100以内所有的质数,并打印出来,其实我们只需要在方法一的基础上,在加一层循环就可以实现
n=int(input(">>>")) #输入一个数字
for i in range(2,n+1): #第一层计算的是数字2到n之间所有数字依次判断
for j in range(2,i+1): #第二层只需要进行和方法一一样的判断就可以。
if i % j == 0:
break
if(i==j):
print(i,end=" ")
测试结果:
方法三:方法二第二层里面的比较次数较多,其实我们可以减少的,比如说现在一个数字是47,我们只需要比较7以内的数字就可以了,如果不能整除,这个数字一定是质数。这样就可以减少比较的次数,进而优化算法;
n=int(input(">>>")) #输入一个数字
for i in range(2,n+1): #第一层计算的是数字2到n之间所有数字依次判断
for j in range(2,int((i+1)**0.5)+1): #第二层判断次数就可以减少。
if i % j == 0:
break
else:
print(i,end=" ") #如果i % j 不等于 0,输出i
测试结果:
方法四:
根据素数的性质,进行比较,我们都知道大于5的素数,都是在6的倍数附近,(这里不做证明),举个例子,比如说:
我们计算的41和43都是素数,6*7=42正好是相邻的。这里算出素数则是快捷了很多倍。
n = int(input(">>>"))
count = 2 #count 记录质数的个数
print(2,3,sep=" ",end=" ") #优先打印小于5的质数,
for num in range(4,n): #从4开始迭代
if num % 6 != 1 and num % 6 != 5:
continue #判断一个数字是不是在6k(k为正整数)附近,如果是在进入else;
else:
snum = int(num**0.5)+1
for i in range(5,snum):
if not num%i:
break
else:
count += 1
print(num,end=" ")
print(count)
测试结果;
方法五:基于python 列表,进行计算
import math
n=int(input(">>>"))
lst=[2]
for n in range(3,n):
for i in lst: #在列表里面找,因为一个合数一定可以拆分为多个素数之积。
if not n % i:
break
else:
print(n,end=" ")
lst.append(n) #把新算出的素数添加到列表;
测试结果;
方法六:方法五相对于上面四种方法来讲,比较计算的次数是很少的。方法六的思路是我们是不是可以在列表里面只要进行n次,如果列表里面有n的2次方个元素:
import math
import datetime
n = int(input(">>>"))
lst = [] #空的列表
flag = False #标签判断哪一种情况退出
count = 0 #计数器
start = datetime.datetime.now()
for x in range (2,n):
for i in lst:
count += 1
if x % i == 0:
flag = True
break
if i>= math.ceil(x**0.5):
flag = False
break
if not flag:
lst.append(x)
delta = (datetime.datetime.now() - start).total_seconds() #总时间
print(len(lst))
print(count)
print(delta)
测试结果;
测试的结果可以看出,一百万以内的素数有78498个,只需要8.7秒算出来;
方法七:
如果我们把6相邻的数字,放到一个列表里面计算是不是会更加快捷:
import math
import datetime
n = int(input(">>>"))
lst = []
lst1 = []
flag = False
count = 0
start = datetime.datetime.now()
for num in range(4,n):
if num % 6 != 1 and num % 6 != 5 or num % 5 ==0:
continue
else:
lst1.append(num)
#print(lst1)
for x in lst1:
for i in lst:
count += 1
if x % i == 0:
flag = True
break
if i>= math.ceil(x**0.5):
flag = False
break
if not flag:
lst.append(x)
delta = (datetime.datetime.now() - start).total_seconds()
print(len(lst))
print(count)
print(delta)
测试结果:
相对来说计算的次数减少了200万次,省了1.1秒。
综上几种方法来讲,方法四相对来说对于大多说人而言会简单一点,通俗易懂。浅薄的间接,还请笑纳!