SPOJ 2. Prime Generator

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

1*100=100
2*50=100
4*25=100
5*20=100
10*10=100
20*5=100
25*4=100
50*2=100
100*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 math

t=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,没有进行验证。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值