项目欧拉#35 - 圆形素数

时间:2015-04-14 13:57:46

标签: swift primes

我正在尝试解决Project Euler's problem #35问:

  

这个数字197被称为循环素数,因为数字的所有旋转:197,971和719本身都是素数。

     

在100:2,3,5,7,11,13,17,31,37,71,73,79和97之下有十三个这样的素数。

     

在一百万以下有多少个圆形素数?

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

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的正确结果,但最后我得到的结果不正确,无法看出问题所在。

3 个答案:

答案 0 :(得分:5)

因此,我不想剥夺您寻找PE解决方案的乐趣 我只给出一个提示:

使用3检查rotations(getArray(N))的数字N的输出 或更多数字。这不是你所期望的(但可以很容易地修复)。

答案 1 :(得分:2)

我认为马丁在答案中指出了问题所在,但我认为在这类问题上效率也非常重要。

我对改进代码的建议是在你的Eratosthenes筛选中,你可以改进它以改变以下几行:

for i in 2..<primes.count

对于这个:

for (var i = 2; i * i <= primes.count; ++i)

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

你可以做更多的改进,但取决于你,我强烈推荐你在编程比赛中经验丰富的俄罗斯程序员的以下两篇文章:

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

我希望这对你有所帮助。

答案 2 :(得分:0)

提示。考虑如果在旋转之前你的起始素数包含数字'8'会发生什么。