2013-07-05 3 views
0

Я только начал изучать питон и системное программирование. Для задания домашней работы мне нужно найти и напечатать n-е простое число. Я написал код ниже - я могу найти список простых чисел, которые меньше или равны n, однако я не знаю, как я могу напечатать nth prime из списка, который я создал. Я продолжаю получать индексную ошибку: индекс индекса за пределами диапазона.Как распечатать из списка?

Я верю, что чего-то не хватает. Может ли кто-нибудь взглянуть на мой код и дать мне некоторое руководство по его устранению? Ваша помощь очень ценится. Спасибо.

import sys 
import math 


def s_prime(n): 
    is_prime=list(range(n+1)) 
    for i in range(2, int(n**0.5)+1): 
     if is_prime[i]: 
      for j in range(i**2,n+1,i): 
       is_prime[j]=False 
    print 'Prime Value in Decimal: ', [x for x in is_prime[2:] if x] 
    x_list = [x for x in is_prime[2:] if x] 
    print x_list[n-1] 


def main(argv): 
    input = int(sys.argv[1]) 
    if input == 1: 
     print 2 
    elif input == 2: 
     print 3 
    else: 
     n = int(round(input*(math.log(input,2)))) 
     s_prime(n) 


if __name__ == "__main__": 
    main(sys.argv[1:]) 
+0

Если вы только начинаете с Python, я бы рекомендовал использовать Python 3.x, если ваш класс не требует Python 2.x. (Ваши заявления о печати здесь не являются функциями.) Кроме того, с ошибками индекса я настоятельно рекомендую сначала распечатать индексы и длину любого списка, который вы используете в качестве этапа отладки. – TakeS

ответ

1

Как вы изменили значение n здесь, n = int(round(input*(math.log(input,2)))). Теперь это нечто большее, чем оригинал n. Например, когда input = 5, n равно 12, и, очевидно, x_list содержит только 5 элементов, поэтому вы получите IndexError, так как индекс 11 не связан.

Вы можете либо с использованием отрицательной индексации здесь:

return x_list[-1], чтобы получить последний элемент.

или передать исходный input премьер функции:

def s_prime(n, inp): 
    print n 
    #you code here.... 
    print x_list[inp-1] 

def main(argv): 
    #your code 
     n = int(round(input*(math.log(input,2)))) 
     s_prime(n, input) #pass input here 
+0

Я использовал ваше предложение и изменил свои функции. Это сработало! Спасибо огромное! знак равно – user2203774

0

Проблема в том, что вы генерируете простые числа до n и сохраняете их в списке. Ясно, что этот список содержит менее n предметов, поэтому, когда вы пытаетесь найти нуль nth, вы получаете "index out of range error".

Чтобы исправить это, вы можете генерировать простые числа, пока вы найдете нулевое значение nth, или вы можете выбрать большую верхнюю границу для генерации списка простых чисел. Вы можете использовать это, чтобы помочь выбрать верхнюю границу this.

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