私はRubyに比較的慣れていませんが、言語に関しては十分に単純に思えます。私はRubyでEuler Projectに取り組んでおり、次の速度に大きな問題があります:
10 未満の素数の合計は 2 + 3 + 5 + 7 = 17 です。200 万未満のすべての素数の合計を求めます。
私のコード:
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 を入力したときよりもはるかに高速に出力されます。
論理的または構文的に、またはその両方で間違った方法でこれを行っていますか?