2017-03-03 31 views
1

此代码是用Python 3编写的。我试图找到10001的素数。为什么函数在Python中返回错误“列表索引超出范围”?

#10001st prime number 
mylist=[] 
def prime_index(n): 
    for i in range(99**99): 
     for x in range(2, int(i**1/2)): 
      if i % x == 0: 
       return False 
      return True 
      mylist.append(i) 
     n=int(n+1) 
     print(mylist[n]) 
     break 
prime_index(10001) 

当我运行,它说:“列表索引超出范围”,指的是print(mylist[n])。 但是,我一直在mylist.append(i)的路上添加素数。那么有人可以告诉我这里有什么问题,因为我不明白发生了什么。 99 ** 99是否太小?或者更细微的代码问题?

+2

我认为当'print()'执行时''n的值会让你感到惊讶。将一些调试打印语句添加到您的代码中以确定执行时发生了什么;用这种方法你可以看你的代码运行。特别是,在执行print()之前打印出'n'的值,以便您可以看到代码尝试显示的数组中的索引。 – jefe2000

+2

现在你的代码在mylist的长度为0时第一次到达违规行。 –

+0

'range(99 ** 99)'产生一个与mylist无关的数字列表。 – DyZ

回答

3

99**99不是太小;如果你真的打印出来了,那么你已经超出了你的需要(如果你试图运行它,你永远不会完成,这是657位工作)。但是你的循环毫无意义;如果它执行一次,您的内循环将立即返回TrueFalse

对你来说“幸运”,它永远不会执行一次。第一个外部循环第一次将i设置为0,因此内部循环根本不运行(侧面注意,您可能想要i ** (1/2),而不是i ** 1/2;指数优先于分割)。因为它没有运行,所以最终将索引到一个空列表中(并且索引10001的索引不低于)。

这段代码中存在太多的问题来解决它们;寻找其他试验部门主要发现代码来了解它应该是什么样子。

1

问题是,当您找到(或不)第一个素数时,您尝试打印出10001st元素。此外,请注意,如果您没有找到任何素数,那么您从例程中返回,如果您想要获得那么多。没有办法达到附加声明。

你得只是因为你的第一次迭代中得到的具有i = 0 打印声明,这样你就不会为循环进入可言。

请按照发布指南:花时间研究如何生成素数。它可以比你做的快得多,并会给你一个很好的,简洁的代码放入你的程序。

+0

非常感谢大家,我现在已经解决了! –