这是我的代码。代码根本不运行,这使我相信问题是无限循环或类似的东西。
# 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)
答案 0 :(得分:1)
你的测试是错误的。 n%i != 0
表示该数字不能被i
分割,这意味着主要测试不应该失败。这里有很多“额外”的语法,使你的方法有点难以理解。例如,test == true
是多余的(如果test
是true
或false
或其他任何内容,您可以说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
的条件将始终为真。因此无限循环。