Я новичок в информатике и программировании. Я посещаю бесплатный онлайн-курс по программированию, и одним из заданий было написать программу, которая будет генерировать 1000-е простое число.
К вашему сведению, это в Python 2.5.4
Вот исходный код, который я скопировал (и немного отредактировал) из другой темы на этом форуме:
def isprime(n):
if n<2:
return False
else:
for i in range(2,(n/2+1)):
if n%i==0:
return False
else:
return True
def nthprime(n):
x=[]
j=2
while len(x)<n:
if (isprime(j)) == True:
x.append(j)
j =j+1
return(x[n-1])
print nthprime(1000)
Однако я подумал, что смогу сделать программу быстрее, переписав функцию isprime(n) следующим образом:
def isprime(n):# First the primality test
i=1
if n<2:
return False
if (n!=2 and (n/2*2==n)):
return False
if n==3:
return True
if n==5:
return True
else:
while i <= (n/2+1):
i+=2
if n%i==0:
return False
else:
return True
Таким образом, когда он только проверяет, делится ли n на нечетные целые числа (к этому моменту кода мы уже знаем, что n нечетно и, следовательно, не делится ни на какие четные целые числа).
Я думал, что переписав его таким образом, программа будет работать в два раза быстрее (поскольку она проверяет только вдвое меньше чисел), но, похоже, это занимает столько же времени или даже немного больше, чем раньше.
Кроме того, есть ли способ переписать второй блок кода, чтобы избавиться от:
if n==3:
return True
if n==5:
return True
Единственная причина, по которой я включил это, заключается в том, что я понял, что мой алгоритм генерирует «ложь» для 3 и 5, даже если они простые.
3.6
- person Wombatz   schedule 28.06.2017n/2*2==n
— плохой (и неправильный в Python 3) способ проверки четных чисел. - person treecoder   schedule 28.06.2017false
, заключалась в том, что вы выполняетеi += 2
перед проверкой, является ли оно простым, поэтому в итоге вы тестируете3%3
и5%5
. Сохранив структуру старого кода, вы могли бы сохранитьfor
и шаг за шагом два:for i in range(3,(n/2+1), 2)
илиfor i in range(3,(math.sqrt(n)+1), 2)
для лучшего верхнего предела. - person Ken Y-N   schedule 28.06.2017