【问题标题】:Logical error in code?代码中的逻辑错误?
【发布时间】:2015-01-22 19:20:03
【问题描述】:

问题: 数字 3797 有一个有趣的特性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797、797、97 和 7。类似地,我们可以从右到左工作:3797、379、37 和 3。

找出唯一可以从左到右和从右到左截断的十一个素数的总和。注意:2、3、5 和 7 不被视为可截断的素数。

我的代码只能输出前五个这样的数字并显示以下错误:

Traceback (most recent call last):
  File "main.py", line 41, in 
    if check(i) and check(rev(i)):
  File "main.py", line 30, in check
    if sieve[n]:
IndexError: list index out of range

代码:

sieve = [True] * 1000001 # Sieve is faster for 2M primes
def mark(sieve, x):
    for i in xrange(x+x, len(sieve), x):
        sieve[i] = False
sieve[0],sieve[1]=False,False
for x in xrange(2, int(len(sieve) ** 0.5) + 1):
    if sieve[x]: mark(sieve, x)


def rev(n):
  s=0
  while n>0:
    s=s*10+n%10
    n/=10
  return s

def check(n):
  flag=1
  while n>0:
    if sieve[n]:
      n/=10
    else:
      flag=0
      break
  return flag==1

ctr=0
i=11
s=0
while ctr!=11:
  if check(i) and check(rev(i)):
    print i
    s+=i
    ctr+=1
  i+=1

print s

lww=raw_input()

【问题讨论】:

  • 你是不是刚从筛子的末端跑掉了?
  • 这似乎很有可能。你知道第 11 个双向截断素数有多大吗?
  • 如果您只是添加一些代码来捕获异常和print n,我们实际上会知道这是否是问题所在,而不必猜测......
  • 根据A020994,左截断和右截断的素数分别是2、3、5、7、23、37、53、73、313、317、373、797 , 3137, 3797, 739397。因此,如果他的筛子和测试实施正确,它们都将适合。 (不过,很好的猜测,@user2357112,即使它不是答案。)

标签: python


【解决方案1】:

您的算法不正确。您正在寻找素数 p 使得 p 可以从右到左截断,reverse(p) 可以从右到左截断。

然而,问题要求您找到素数 p,使得 p 从右到左可截断,p 从左到右可截断。 p 从左到右的截断性不等同于reverse(p) 从右到左的截断性。

考虑问题中给出的数字,3797 - 它在两个方向上都是可截断的(因此您的代码应该可以捕捉到它),但它的反向 7973 不能从右到左截断,所以您的代码拒绝它。这应该已经告诉你了。

您需要删除reverse(因为它在这里没有任何作用),而是修改您的检查代码以在两个方向上截断。


你得到一个IndexError,因为你用完了筛子——你的代码正确地计算出只有5个质数p小于100万,这样p是从右到左截断的,reverse(p)是从右到左截断。由于那时您还没有跳出循环(因为ctr < 11),您的代码尝试访问sieve[len(sieve)],并点击IndexError


另外 - 这与你的问题并没有真正的关系 - 我认为你来自 C 背景或类似的东西。您的代码有点难以阅读,因为它不符合标准的 Python 样式约定。一旦您自己解决了这个问题(本着 Project Euler 的精神),请查看this gist 以了解我对您的实现的更正,即 1.) 使其正常工作;和 2.) 更接近标准的 Pythonic 风格。

【讨论】:

  • 是的,实际上我学过一点 java、c 和 c++,因为易于访问和更简单的编码(没有数据类型和其他东西)而学习了 python……真的对 python 风格一无所知如果您能建议我一种在我的 python 程序中实现它的方法,那么约定将是可观的!
  • 如果你有时间,你应该阅读PEP 8,这是Python风格的权威文档。特别是,请查看“代码布局”和“命名约定”部分。目前最重要的是,与您的缩进保持一致 - 每个缩进级别使用 4 个空格。您的代码现在混合了 2 个空格和 4 个空格的缩进,这可能会导致以后出现令人讨厌的缩进错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多