【问题标题】:Python: finding the +100th prime numberPython:找到第 100 个素数
【发布时间】:2013-12-30 10:49:51
【问题描述】:

我的程序有一个奇怪的问题。 当 n

File "my_code.py2", line 24, in 
    print k[int(n)]
IndexError: list index out of range

代码:

k=[]
z=[]
a=0
k.append(1)
k.append(2)
k.append(3)
n=raw_input()
while n!="END" and int(n)>0 and int(n)%100000==int(n):              
    for x in xrange(3,7919,2): 
        for i in xrange(3,x,2):      
            if x%i!=0:
                a=1
            else:
                a=0
                break
        if a==1:
            k.append(x)
        if len(k)==int(n):
            break          
    print k[int(n)]
    n=raw_input()

你能帮我吗???

【问题讨论】:

  • 它对我来说并不“正常工作”——至少在 5、10、50 的输入上不行。

标签: python numbers primes


【解决方案1】:

我认为你有一个错误。 Python 使用从零开始的索引,因此要获取第 121 个元素,您需要访问k[120] 的列表。

顺便说一句,1 不是质数。


编辑: 我可以建议一个更好的算法,而不是修复您在 cmets 中提到的代码的其他问题? sieve of eratosthenes 不是检查除数,而是列出所有低于界限的素数的常用方法。它很容易实现,并且应该比您当前使用嵌套循环的方法更快。

【讨论】:

  • 同意。但是,哪个是 k[0] 并不重要,因为我永远不会要求它。我还有一个大问题。自己试试这个。如果我按一个大数字(例如 25 或其他数字)而不先按数字 1,2 或 3,它会显示: File "my_code.py2", line 24, in print k[int(n)] IndexError: list index out范围
【解决方案2】:

这是因为你在len(k) == int(n) 时中断了循环,然后访问k[int(n)]。由于python使用基于0的索引,当列表长度等于n时,你可以访问的最后一个索引是n-1

当您将 1 添加到列表中时,并且 1 不是素数,列表中的每个其他素数都会有它们的实际索引。

即 2 在索引 1 处,2 是第一个素数。 3 在索引 2 处,3 是第二个素数。

因此,解决方案是将len(k) == int(n) 更改为len(k) == int(n) + 1

注意:您的程序还有另一个问题。当外循环内的语句被执行时。它不断向k 添加不必要的元素。所以,我建议首先计算所有素数到一定限度。然后只需查询该列表。不要从头重复计算所有素数。

k=[]
z=[]
a=0

k.append(1)
k.append(2)
k.append(3)

for x in xrange(3,7919,2): 
    for i in xrange(3,x,2):      
        if x%i!=0:
            a=1
        else:
            a=0
            break
    if a==1:
        k.append(x)

n = raw_input()
while n!="END" and int(n)>0 and int(n) < len(k):                      
    print k[int(n)]
    n = raw_input()

【讨论】:

  • 首先感谢您的帮助。我解决了我的一个主要问题。但是现在我有另一个问题......当谈到 n>100 它说错误的答案......
  • 你看到我的答案的编辑版本了吗?您的早期版本的问题是这样的。假设您第一次要求 4th prime。在那次迭代之后,k 将是 [1, 2, 3, 5, 7]。当您在 while 循环的第二次迭代中查询另一个素数(例如第 10 个)时,它会将下一个素数添加到现有列表中。所以列表现在将是 [1, 2, 3, 5, 7, 3, 5, 7, 11, 13]。这就是为什么你得到错误的答案。要么您必须在每次迭代时清除 k 。或者像我的解决方案一样只计算一次,然后只查询它。 :-)
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2016-09-15
  • 2011-04-22
  • 2022-12-21
相关资源
最近更新 更多