素数を求めよ
https://www.spoj.pl/problems/PRIME1/を考えてた。
Pythonで提出できるから、いちど書いてから、もういちど書き直したのがこれ。
けっこう綺麗にかけた?
#!/usr/bin/env python import math def main(): t=input() #何組の数字が入ってくるのか L=[] #最大値・最小値のリストを保存するリスト searchlist = [] #探索する値のリスト primelist = [] #見つかった素数のリスト #一組ずつLに加えてゆく for i in range(t): i = raw_input() L.append(i.split(" ")) for i in L: searchlist = makeList(i) primelist = findPrime(searchlist,int(i[0]),int(i[1]) + 1) for i in primelist: print i print "" def makeList(list): #listから最小値と最大値を取り出す start = int(list[0]) end = int(list[1]) + 1 #startからendまでのすべての整数を含むリストsearchlistをつくる searchlist= range(start,end) return searchlist #素数を探す関数 def findPrime(searchlist,min,max): buffer = searchlist primelist = [] i = 2 sqrt_max = math.sqrt(max) while(i<sqrt_max): #iの倍数でminより大きい最小の数xを探す x=math.ceil(float(min)/i) x=x*i+i #限定エラストテネス #iがバッファに残っているなら素数 if(i in buffer): #バッファからx+i,x+2i,x+3x...を消す while(x<=max): try: buffer.remove(x) except: pass x=x+i #次のiへ i=i+1 #残ったbufferを返す return buffer if __name__ == '__main__': main()
でも、これでも実行時間制限にひっかかる。6秒の壁は高いなあ。
どこを改良できるのかな...うーん。
最初に書いたやつ
なにかの時のために貼っとく
けど汚いからあんまり見ないで;;
#!/usr/bin/env python import math def main(): t=input() #何組の数字が入ってくるのか L=[] #最大値・最小値のリストを保存するリスト searchlist = [] #探索する値のリスト primelist = [] #見つかった素数のリスト #一組ずつLに加えてゆく for i in range(t): i = raw_input() L.append(i.split(" ")) for i in L: searchlist = makeList(i) primelist = findPrime(searchlist) for i in primelist: print i print "" #素数かどうか調べる関数 def isThisPrime(i): s = math.sqrt(i) s = math.floor(s) for a in range(2,int(s)): if(i%s==0): #割り切れたら素数ではない return False #割り切れなかったら素数 return True #listからiの倍数を探す関数 def findFactorFromlist(i,list): factorlist = [] if(i in list): for a in list: if( a % i == 0): factorlist.append(a) return factorlist def makeList(list): #listから最小値と最大値を取り出す start = int(list[0]) end = int(list[1]) + 1 #startからendまでのすべての整数を含むリストsearchlistをつくる searchlist= range(start,end) return searchlist #素数を探す関数 def findPrime(searchlist): slist = searchlist primelist = [] comprositelist = [] factorlist = [] maxvalue = (slist[-1:])[0] #slistに入っている数字を一つずつみていく。 #素数かどうか検証する前に、合成数のリストに入ってないか確認 #素数を見つけたら、素数リストに追加して、 #さらに見つけた素数の倍数を合成数のリストに追加しておく for a in slist: if not a in comprositelist: if(isThisPrime(a)): primelist.append(a) multiplier = 2 while(a*multiplier<=maxvalue): comprositelist.append(a*multiplier) multiplier=multiplier+1 #完成したprimelistを返す return primelist if __name__ == '__main__': main()