2016-02-16 4 views
-2
def isPrime(n): 
    for i in range(2,math.sqrt(n)): 
     if n%i ==0 : 
      return False 

    return True 



#limits calculated using prime number theory by hand 
primes=[] 
for num in range(104319,114319): 
    if isPrime(num): 
     primes.append(num) 

Я использую Ideone.Почему этот код python дает ошибку времени выполнения?

Это ошибка

Runtime error time: 0.03 memory: 9984 signal:-1

Traceback (most recent call last): File "./prog.py", line 13, in File "./prog.py", line 2, in isPrime NameError: name 'math' is not defined

+3

отправьте полную трассировку стека – n1c9

+1

Функция 'range()' требует целочисленных значений. 'range (2, math.sqrt (n))' не будет работать. –

+1

Визуально у вас есть проблема с 'range (2, math.sqrt (n))', поскольку второй аргумент является float, а не обязательным 'int' – dawg

ответ

2

Это дает вам эту ошибку, потому что вы забыли импортировать math. Однако, даже если вы это сделаете, у вас все еще будет ошибка, потому что range() ожидает целочисленный аргумент, а math.sqrt() возвращает float. Кроме того, вам нужно пройти один выше квадратного корня, потому что второй аргумент range() является исключительным. Вы можете сделать это:

import math 

def isPrime(n): 
    for i in range(2, int(math.sqrt(n)) + 1): 
     if n%i == 0: 
      return False 

    return True 



#limits calculated using prime number theory by hand 
primes=[] 
for num in range(104319,114319): 
    if isPrime(num): 
     primes.append(num) 
+0

Просто, чтобы быть ясным, это исправляет ошибку времени выполнения, но не исправляет isPrime(), которая все еще проходит 4, 8, 9, 15 и т. Д. В виде простых чисел. – cdlane

+0

@cdlane: Ницца место. Я починил это. – zondo

1

math.sqrt возвращает объект с плавающей точкой, но range нужен int объекта. Вы должны сделать

def isPrime(n): 
    for i in range(2,int(math.sqrt(n))+1): #Convert the result of math.sqrt to int 
     if n%i ==0 : 
      return False 
    return True 

Edit: После правки «NameError: название„математика“не определен», вы должны импортировать математику в начале

import math 

def isPrime(n): 
#... 
+0

Чтобы это было ясно, это исправляет ошибку времени выполнения, но не исправляет isPrime(), которая все еще проходит 4, 8, 9, 15 и т. Д. В виде простых чисел. – cdlane

+0

@cdlane Правильно, верхний предел диапазона увеличивается на единицу, чтобы проверить все номера до тех пор, пока не будет включен 'sqrt (n)'. Спасибо –

0

В верхней части кода вам нужно импортировать модуль, которому вы звоните, как этот

import math 
0

Следующее должно исправить ваш код.

import math 

def isprime(n): 
    for i in range(2, int(math.sqrt(n))): 
      if n%i == 0: 
       return False 
      else: 
       return True 
+0

Это исправляет аргументы диапазона OP(), но не исправляет его код. Эта процедура isprime(), кажется, считает, что 9, 15, 21, 25, 27, 33 и т. Д. Являются простыми. У OP было лучше с «возвратом True» после цикла, хотя все еще неправильно. – cdlane

Смежные вопросы