求素数最优代码(python)

此代码为我学习python时编写,特点是在前人的基础上作了充分优化。
1 ,搜索表充分缩短,速度极快。
2,可以中断运行,并可从中断处恢复运行。
3,程序按ss()运行。
>>>ss()
4,运算时屏幕输出形式如下
>>> ss()
(100000, ‘———-‘, 9592)
(200000, ‘———-‘, 8392)
(300000, ‘———-‘, 8013)
(400000, ‘———-‘, 7863)
。。。。。。
意思为每间隔100000中含有的素数个数,我编此程序是为寻找素数分布规律而作。
5,程序可无限运行,按ctrl-c可以中断运行
6,程序中断但不关闭运行窗口时,
>>> list_num[-1]
1299989 打印输出现在计算出的最大素数, list_num[]中存有已经计算机的素数列表;
>>> n
100021 打印输出现在计算到第几个素数了。
>>>w() 保存素数列表到a.txt,保存运行变量到b.txt
此时可以关闭运行窗口了。
6,下次如想接着运行,可以先
>>>r() 读取保存的变量到内存
>>>ss() 然后接着运行。
7,运行的极限是你电脑上python列表支持的长度极限
8,保存和读取的时间,随你已计算出的素数个数而变化。

以下是源代码,可以直接拷贝运行

# -*- coding:utf-8 -*-
#   1, ss()求素数
#   2,ctrl-c 中断程序
#   3,w()保存素数列表到a.txt,运行变量到b.txt
#   4, r()读取保存的变量到内存
#   5, ss()再次运行求素数程序
#   6, list_num[-1]打印输出现在计算出的最大素数
#   7, n 现在已经计算出了多少个素数
import math


list_num=[2]                 #存放算出的质数
i=3                     #待测数,不断递增
n=1                     #质数的编号
tab=100000              #统计区间的大小
ii=1                    #第几个统计区间
tem=0                   #另时计数用

def ss():
    global    list_num            #存放算出的质数
    global    i                     #待测数,不断递增
    global    n                    #质数的编号
    global    tab              #统计区间的大小
    global    ii
    global    tem

    while 1:

        tem1=int(math.sqrt(i))+1
        tem2=True

        for num in list_num:
            if num>tem1:break
            if i % num == 0 :
                tem2=False        
                break
        if tem2==True:      #得到一个质数
                list_num.append(i)
                n+=1
#                print(n,"---",i)

        if i==ii*tab:
                print(ii*tab,"----------",n - tem)
                ii+=1
                tem = n

        i+=1


def w():
    ###########写入质数列表
    Li=[1,2,3,4,5,6]
    pre=str(list_num)
    pre=pre.replace("[","")
    pre=pre.replace("]","")+"\n"
    #print (pre)
    f=open("a.txt","w")
    f.write(pre)
    f.close()

    ###############写入运行时参数
    Li=[i,n,tab,ii,tem]
    pre=str(Li)
    pre=pre.replace("[","")
    pre=pre.replace("]","")+"\n"
    f=open("b.txt","w")
    f.write(pre)
    f.close()


def r():
    global    list_num            #存放算出的质数
    global    i                     #待测数,不断递增
    global    n                    #质数的编号
    global    tab              #统计区间的大小
    global    ii
    global    tem

    ###########读取质数列表
    f=open("a.txt","r")
    iii=f.readline() 
    iii=iii.replace("\n","")
    Li=iii.split(",")
    f.close()
    #print (Li)
    list_num=[]
    for i in Li:
        list_num.append(int(i))

    ###############读取运行时参数
    f=open("b.txt","r")
    iii=f.readline() 
    iii=iii.replace("\n","")
    Li=iii.split(",")
    f.close()
    #print (Li)
    i,n,tab,ii,tem = int(Li[0]),int(Li[1]),int(Li[2]),int(Li[3]),int(Li[4])

引用块内容

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值