质数的算法比较 -----基于python

方法一:最基本的比较方法,就是基于判断一个数字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秒。

 

综上几种方法来讲,方法四相对来说对于大多说人而言会简单一点,通俗易懂。浅薄的间接,还请笑纳!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值