为什么我对Euler#7(10001 prime)的解决方案不起作用?

时间:2014-03-09 18:04:14

标签: ruby

这是我的代码。代码根本不运行,这使我相信问题是无限循环或类似的东西。

# Question_7, Answer = 104743
# By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
# What is the 10 001st prime number?
def prime_at(x)
    primes = [2, 3]
    n = 4
    test = true
    while primes.length <= x
        primes.each do |i|
            if n % i != 0
                test = false
            end
        end
        if test == true
            primes.push(n)
        end
        n += 1
    end
    puts primes[-1]
end
prime_at(10001)

2 个答案:

答案 0 :(得分:1)

你的测试是错误的。 n%i != 0表示该数字不能被i分割,这意味着主要测试不应该失败。这里有很多“额外”的语法,使你的方法有点难以理解。例如,test == true是多余的(如果testtruefalse或其他任何内容,您可以说if test)。 n%i != 0已经返回一个布尔值,因此不需要整个if语句。

在其他语言中删除这么多构造可能看起来有点奇怪,但Ruby可以让你非常清楚地理解你的想法。以下是我对这种方法的建议(我根本没有改变你的算法,这只是一个重写):

def prime_at(x)
  primes = [2,3]
  n = 4
  until primes.length == x
    primes << n if primes.all? {|p| n % p > 0 }
    n += 1
  end
  primes.last
end

答案 1 :(得分:1)

是的,你有一个无限循环。错误是,一旦变量test设置为false,它就永远不会更改为true,因此您不会将元素添加到素数数组中。这意味着循环primes.length <= x的条件将始终为真。因此无限循环。