首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >项目Euler #35 -圆形素数

项目Euler #35 -圆形素数
EN

Stack Overflow用户
提问于 2015-04-14 13:57:45
回答 3查看 428关注 0票数 0

我正在试图解决Euler项目问题#35问题,它要求:

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

为了解决这个问题,我在Swift中使用了以下代码:

代码语言:javascript
运行
复制
let size = 1000000

func ESieve(x : Int) -> [Bool] {

    var primes = [Bool](count: x + 1, repeatedValue: true)
    primes[0] = false
    primes[1] = false

    for var i = 2; i < primes.count; i++ {
        if !primes[i] {
           continue
        }

        for (var j = 2*i; j < primes.count; j += i) {
           primes[j] = false
        }
    }

    return primes
}

let sieve = ESieve(size)

func getPrimes() -> [Int] {

   var array = [Int]()
   for (var i = 0; i < sieve.count; i++) {
      if sieve[i] {
        array.append(i)
      }
   }
   return array
}

let primes = getPrimes()


func rotations(v : [Int]) -> [Int] {
   var result = [Int]()

   for (var i = 0; i < v.count; i++) {
      var r = 0
      for (var j = i; j < v.count + i; j++) {
         r = 10*r + v[j % v.count]
      }
      result.append(r)
   }
   return result
}

func getArray(x : Int) -> [Int] {
   
   var array = [Int]()
   var i = x
   while i > 0 {
     array.append(i%10)
     i /= 10
   }
   return array
}

func isAllPrime(v : [Int]) -> Bool {
   
   for i in v {
     if !sieve[i] {
       return false
     }
   }
   return true
}

var s = 0
for (var i = 0; i < primes.count; i++) {
   var array = getArray(primes[i])
   var perms = rotations(array)
   if isAllPrime(perms) {
      s++
   }
}

println(s)

所有的功能似乎都正常工作。即使我将size设置为100,我也得到了正确的循环素数为13的结果,但是我始终得到了错误的结果,并且看不出问题出在哪里。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-14 14:51:39

我不想剥夺你joy找到体育解决方案的机会,所以我只给你一个提示:

检查rotations(getArray(N))的输出是否有3位或更多位数的数字N。这不是你所期望的(但可以很容易地解决)。

票数 5
EN

Stack Overflow用户

发布于 2015-04-14 15:15:18

我认为Martin在他的回答中指出了问题,但是我认为在这种问题中效率也是非常重要的。

我对改进代码的建议是在Eratosthenes的筛子中,您可以对其进行大量改进,修改如下一行:

代码语言:javascript
运行
复制
for i in 2..<primes.count

这一次:

代码语言:javascript
运行
复制
for (var i = 2; i * i <= primes.count; ++i)

上述改进只执行不超过根n的简单筛分。

您可以做更多的改进,但取决于您,我强烈建议您在编程竞赛中使用以下两篇经验丰富的俄罗斯编码器文章:

  • 埃拉托斯提尼筛
  • 具有线性时间功的Eratosthenes筛

你必须翻译它来阅读,因为它是俄文,但你可以使用谷歌翻译。

希望这能帮到你。

票数 2
EN

Stack Overflow用户

发布于 2015-04-18 18:25:59

暗示一下。考虑一下,如果你的起始质数在旋转前包含数字'8‘,会发生什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29629328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档