【问题标题】:Project Euler #35 - Circular Primes (Incorrect Result by 1)Project Euler #35 - 圆形素数(1 的错误结果)
【发布时间】:2015-11-07 00:10:49
【问题描述】:

我试图尝试欧拉项目的第 35 个问题 (click here)。问题是这样的:

数字 197 被称为圆素数,因为数字 197、971 和 719 的所有旋转本身都是素数。
100 以下的素数有 13 个:2、3、5、7、11、13、17、31、37、71、73、79 和 97。
一百万以下的圆素数有多少?

所以我用前一百万个数字创建了一个筛子,以得到一百万以下的所有素数,并用它来比较素数的旋转结果。

arr = []

for i in range(2, len(sieve)):
    if sieve[i]:
        sub_arr = retCircular(i)
        count = len(sub_arr)
        carry = 0
        for j in sub_arr:
            if sieve[j]:
                carry += 1
                sieve[j] = False
            else:
                break
        if carry == count:
            for j in sub_arr:
                arr.append(j)

print "Number of circular primes =", len(arr)

这个程序将 100 万以下的圆素数的数量设为 54,而实际答案是 55。有人可以帮我解决我哪里出错了吗?

注意:

  1. retCircular(n) 是一个用户定义的函数,它返回数组中数字的所有循环形式。
  2. 'sieve' 是一个布尔值数组,在所有主要位置索引处包含 True,在所有复合位置索引处包含 False。

P/S,如果有人有更好的方法来解决这个问题,请告诉我!

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。特别是,我们需要代码来重现问题。我们还可以使用您的逻辑和数据痕迹——您缺少哪个素数?
  • 在循环之前添加:print sieve[2]。如果答案是3,则您跳过了第一个素数。
  • 考虑如果您的初始素数(在测试循环之前)包含任何数字 0、2、4、5、6、8 会发生什么。请注意单数素数 2 和 5 .

标签: python algorithm project primes


【解决方案1】:

我将在这里使用我的顾问的 ESP:您的 retCircular 方法无法正确处理重复模式,这使得它错过了 repunit(1 的字符串)素数。特别是, retCircular(11) 返回 [11, 11],这会使您的算法将该数字误认为是循环素数。这是我的蛮力版本的方法:

def retCircular(prime):
    prime_str = str(prime)
    family = [prime]
    for _ in range(len(prime_str)-1):
        prime_str = prime_str[1:] + prime_str[0]
        child = int(prime_str)
        if child == prime:
            break
        family.append(int(prime_str))
    return family

...我用你的主程序得到 55 个素数:

Prime family: [2]
Prime family: [3]
Prime family: [5]
Prime family: [7]
Prime family: [11]
Prime family: [13, 31]
Prime family: [17, 71]
Prime family: [37, 73]
Prime family: [79, 97]
Prime family: [113, 131, 311]
Prime family: [197, 971, 719]
Prime family: [199, 991, 919]
Prime family: [337, 373, 733]
Prime family: [1193, 1931, 9311, 3119]
Prime family: [3779, 7793, 7937, 9377]
Prime family: [11939, 19391, 93911, 39119, 91193]
Prime family: [19937, 99371, 93719, 37199, 71993]
Prime family: [193939, 939391, 393919, 939193, 391939, 919393]
Prime family: [199933, 999331, 993319, 933199, 331999, 319993]
Number of circular primes = 55

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多