我对 Ruby 比较陌生,但就语言而言,它似乎很简单。我正在使用 Ruby 完成 Euler 项目,并且在以下方面遇到了很大的速度问题:
10 以下的素数之和为 2 + 3 + 5 + 7 = 17。求两百万以下的所有素数之和。
我的代码:
beginning_time = Time.now
(1..10000).each { |i| i }
def isPrime(num)
factors = 0
primecount = 1
while primecount <= num
if (num%primecount == 0)
factors += 1
end
if (factors > 2)
return false
end
primecount += 1
end
return true
end
def make_sieve(num)
sieve = Array.new(num)
summation = 0
for i in 1..num
if(isPrime(i) == true)
summation += i
puts i
for x in i..num
if x%i == 0
# Go through entire array and make all multiples of i False
sieve[x] = false
else
sieve[i] = true
end
end
else
# If i is NOT prime, move to the next number. in the For Loop
next
end
end
puts summation
end
make_sieve(2000000)
end_time = Time.now
puts "Time elapsed #{(end_time - beginning_time)*1000} milliseconds"
我认为我对筛子的想法是正确的,但我真的不知道发生了什么让这个程序运行如此缓慢。我用 20,000 运行它,大约需要 15 秒,这似乎仍然很慢,尽管输出比我输入 2,000,000 时快得多。
我是在逻辑上或句法上或两者兼而有之的错误方式吗?