SPOJ 2. Prime Generator

来源:互联网 发布:蔡英文执政能力 知乎 编辑:程序博客网 时间:2024/04/27 14:48

素数判断算法,最简单的为试除法,即若要判断一个数n是否为素数,则判断从2~sqrt(n)的数中的每个数m是否能被n整除,若能整除(n%m==0)则n明显不是素数,否则即为素数。只搜索到sqrt(n),可以通过下面的例子理解,假设n=100,

1*100=1002*50=1004*25=1005*20=10010*10=10020*5=10025*4=10050*2=100100*1=100

即100的约数有1,2,4,5,10,20,25,50,100共9个。但其实很明显在从1找到10也就是sqrt(100)的前半部分的时候,如果100还有除了1以外的约数,就已经都找到了,sqrt(100)再到100之间的和前半部分是一样的,只是因子之间换了下位置而已。而如果某个数在2~sqrt(n)之间的前半部分没有约数的话,那么就说明在后半部分也不会有约数了。当然,这个方法是很慢的,所以代码是TLE的,还有一些其他比较快的方法还没仔细看,因为主要是想了解下python。

import matht=input()while t:    l=raw_input()    s=l.split(' ')    m,n=int(s[0]),int(s[1])    if m==1: m=2    for num in xrange(m,n+1):        f=1        for i in xrange(2,int(math.sqrt(num))+1): #sqrt()返回浮点数,xrange的参数需要整数            if num%i==0:                f=0                break;        if f: print str(num)    print    t-=1

1. 对于格式化输入,比如题目中要求输入1 10,好像只能通过

l=raw_input()

s=l.split(' ')

m,n=int(s[0]),int(s[1])

来解决

2. range和xrange的却别是range生成一个列表,如range(1,10000000)会生成一个10000000个元素的列表,很明显这样会占用很多内存,而xrange返回的是一个数,和生成的范围是无关的,其占用的内存大小是固定的。在时间上,xrange也会比range快。可以用下面的命令进行测试

$ python -m timeit 'for i in range(1000000):' ' pass'10 loops, best of 3: 90.5 msec per loop$ python -m timeit 'for i in xrange(1000000):' ' pass'10 loops, best of 3: 51.1 msec per loop

但是看到说在python3.0以后就只有range而没有xrange了,range的功能类似于2.x中的xrange,没有进行验证。

原创粉丝点击