這是一個關於代碼挑戰的問題,請不要提供太多的代碼..我想盡可能地自己弄清楚這一點。
我最近開始進入代碼挑戰,並將其與學習Python(我是一個前端JavaScript開發者白天;))結合起來。到目前爲止,一切進展順利,我確信這是學習新語言的最佳方式(至少對我而言)。打印給定範圍內的所有素數,算法太慢..如何改進? (代碼挑戰)
我目前被困在一個挑戰,要求我打印給定範圍內的所有素數,這一切都是通過簡單的Stdin和Stdout完成的。
到目前爲止,我已經嘗試了兩種方法,兩者都在工作,但速度太慢..下面是一個鏈接和迄今爲止我的最快實現的代碼。也許我錯過了一些超級明顯的東西,導致我的python腳本變慢。目前,它需要1.76s
單個測試用例的一系列1, 100000
http://ideone.com/GT6Xxk(你可以在這裏調試腳本以及)
from sys import stdin
from math import sqrt, ceil
next(stdin) # skip unecessary line that describes the number of test cases
def is_prime(number):
initial_divider = sqrt(number)
if number == 2:
return True
elif number % 2 == 0 or int(initial_divider) == initial_divider:
return False
for divider in range(ceil(initial_divider), 1, -1):
if number % divider == 0:
return False
return True
for line in stdin:
low, high = [int(x) for x in line.split(' ')]
primes = [number for number
in range(max(low, 2), high+1)
if is_prime(number)]
for prime in primes:
print (prime)
print('')
的「分配」的/挑戰是如下的描述:
輸入
輸入開始的測試用例在一行數噸(噸< = 10)。在每個接下來的t行中,有兩個數字m和n(1 < = m < = n < => 1000000000,n-m < = 100000)由空格分隔。
輸出
對於每個測試實例打印所有素數p使得m < = P < = n時,每行一個數>,測試用例由空行分隔。
更新1:我清理的最後一個塊,其中質數和印刷的聚會做的邏輯:
for line in stdin:
low, high = [int(x) for x in line.split(' ')]
for number in range(max(low, 2), high+1):
if is_prime(number):
print (number)
print('')
另一個改進是隻測試'for'循環中的奇數分頻器,因爲你測試數字是否在循環開始之前。 –
@TseselatingHeckler,謝謝你的回覆!這是我希望的那種回覆,一個打破了我的代碼,並告訴我什麼可以改進/是inlogical等我嘗試'\ n'.join方法之前,但忘記了你需要轉換這些數字以字符串;)和你的權利範圍倒計時是如此奇怪,現在,我想起來......當我想出了這些聲音時,感覺有點太困了!我會嘗試實施你所建議的改進,並讓你知道它是否足夠快:D – ajeurissen
ugh在我的is_prime函數中檢測到一個錯誤..不知何故,如果我給它提供數字21,它會返回true ..真正的怪異..我'在我們說話時調試它。我會讓你們保持最新狀態。 – ajeurissen