• 求质数


    求质数

    ##############求质数2
    import datetime
    starttime=datetime.datetime.now()####开始时间
    print(2,end=' ')
    count=1
    for i in range(3,100000,2):
        if i>10 and i % 5 ==0:
            continue
        for j in range(3,int(i**(0.5)+1),2):
            if i % j == 0:
                break
        else:
            count+=1
            print(i,end=' ')
    print('~~~~~~~~~~')
    print(count)
    print(datetime.datetime.now()-starttime)####运行程序所用时间

    另一种方法

    #############求质数3
    flag1=False
    flag2=False
    for i in range(6,100,6):
        e=int(math.sqrt(i)+2)
        for j in range(3,e,2):
            if (i-1)%j==0 and not flag1:
                flag1=True  
            if (i+1)%j==0 and not flag2:
                flag2=True
            if flag1 and flag2:
                break
        if not flag1:
            print(i-1)
        if not flag2:
            print(i+1)

    比较以上两种算法的时间

    start=datetime.datetime.now()
    for i in range(10):
        count1=0
       # print(2,3,end=' ')
        for i in range(6,100000,6):
            flag1=False
            flag2=False
            e=int(math.sqrt(i))+2
            for j in range(3,e,2):
                if not flag1:
                    if (i-1)%j==0:
                        flag1=True
                if not flag2:
                    if (i+1)%j==0:
                        flag2=True
                if flag1 and flag2:
                    break
            if not flag1:
                #print(i-1,end=' ')
                count1+=1
            if not flag2:
                #print(i+1,end=' ')
                count1+=1
    print('~~~~~~~~~~~~!',count1,datetime.datetime.now()-start)
    start2=datetime.datetime.now()
    for i in range(10):
        
        #print(2,end=' ')
        count2=0
        for i in range(3,100000,2):
            if i>10 and i % 5 ==0:
                continue
            for j in range(3,int(i**(0.5)+1),2):
                if i % j == 0:
                    break
            else:
                count2+=1
                #print(i,end=' ')
    print('~~~~~~~~~~~!',count2,datetime.datetime.now()-start2)

    求质数,使用列表,所有合数都是质数的乘积,将所有质数加入列表,通过列表检测,注意边界!

    检测到开平方处。原理类似于加法的一半在中间,乘法的中间在开方处,一旦超过,就是重复测试。

    l=[2]#求质数4
    for i in range(3,100,2):
        e=i**(0.5)
        for j in l:
            if i%j==0:
                break
            if j>e:
                l.append(i)
                break
    print(l,len(l))
        

     这是计算质数,用奇数测试的方法,不用列表

    count=1###求质数5
    print(2,end=' ')
    for i in range(3,100,2):
        flag=False
        for j in range(3,int(i**(0.5))+1,2):
            if i%j==0:
                flag=True
                break
        if not flag:
            print(i,end=' ')
            count += 1
    print('~~~~~~~',count)

    质数有一条特性,质数在大于3后,所有质数都位于6的倍数左右两侧,可以通过列表检测提快速度

    l=[2,3]
    for i in range(6,100,6):
        flag1=False
        flag2=False###求质数6
        e1=(i-1)**(0.5)+1
        e2=(i+1)**(0.5)+1
        for j in l:
            if flag1:
                break
            if j>e1:
                break
            if (i-1)%j==0:
                flag1=True
        for j in l:    
            if flag2:
                break
            if  j>e2:
                break
            if (i+1)%j==0:
                flag2=True
        if flag1==False:
            l.append(i-1)
        if flag2==False:
            l.append(i+1)
        #print('~~~',l)   
    print(l,len(l))
                
    6的倍数两侧求质数

    以上方法,可以看到,非常长,不够优雅,有另一种改变步长的方法,代码较好看。。(计算量相同)

    count=2
    w=5
    step=2
    print(2,3,end=' ')
    while  w<100:
        e=w**(0.5)
        for i in range(3,100,2):
            if w%i==0:
                break
            if i>e:
                print(w,end=' ')
                count+=1
                break
        w+=step
        step=(2 if step==4 else 4)
    print('`````',count)
    变步长求质数

    以上这种方法没有使用列表,用的是6的倍数两侧的数与奇数取偶。

    以下的方法是一种不断改变步长,求质数的方法,使用了列表。

    w=5###求质数8
    step=2
    primenumbers=[2,3]
    while  w<100:
        e=w**(0.5)
        for i in primenumbers:
            if w%i==0:
                break
            if i>e:
                primenumbers.append(w)
                break
        w+=step
        step=(2 if step==4 else 4)
    print(primenumbers,len(primenumbers))
  • 相关阅读:
    【VUE】父子组件通信
    【mysql】密码重设
    Joomla 3.2.0
    浅谈内网渗透
    使用Fiddler的X5S插件查找XSS漏洞
    Asp文件锁定脚本
    php内网探测脚本&简单代理访问
    Linux关闭休眠和屏保模式
    不重启修改计算机名【批处理】
    mimikatz不反弹读取密码
  • 原文地址:https://www.cnblogs.com/rprp789/p/9439314.html
Copyright © 2020-2023  润新知