2016-08-25 8 views
1

私はこの問題は以下のように定義されたプロジェクトオイラーの問題#50(https://projecteuler.net/problem=50)を解決しようとしています:プロジェクトオイラー#50 - 連続プライム合計 - ルビー

ことができる一万人以下のプライム、

を最も多くの 連続素数の和として書かれていますか?

私は2つの異なる解決策を提示していますが、両方とも同じ誤った答えを与えています。私は自分のリストを構築しているのでエラーが発生すると考えていますが、 。私のソリューションは、N = 10N = 100でも動作しますが、N = 1000では動作していないようです。どんな助けもありがとうございます。

解決策1:(出力= 958577)

require 'Prime' 

# Initialising primes 
N = 1_000_000 
primes = {} 

(2..N).each do |i| 
    primes[i] = true 
end 

i = 2 

while i * i <= N 
    if primes[i] 
    j = i 
    while i * j <= N 
     primes[i * j] = false 
     j += 1 
    end 
    end 
    i += 1 
end 

# New prime list where total sum is less than N 
new_primes = [] 
i = 2 
sum = 0 

while sum + i < N 
    if primes[i] 
    new_primes << i 
    sum += i 
    end 
    i += 1 
end 

# Keep removing last prime from list until total sum is prime 
while true 
    if Prime.prime?(new_primes.inject(0, :+)) 
    puts new_primes.inject(0, :+) 
    break 
    else 
    new_primes.delete_at(-1) 
    end 
end 

解決方法2:(出力= 958577)

require 'Prime' 

# Initialising primes 
N = 1_000_000 
primes = {} 

(2..N).each do |i| 
    primes[i] = true 
end 

i = 2 

while i * i <= N 
    if primes[i] 
    j = i 
    while i * j <= N 
     primes[i * j] = false 
     j += 1 
    end 
    end 
    i += 1 
end 


sum = 0 
max = 0 
i = 2 

while i < N 
    if primes[i] 
    sum += i 
    if sum < N && Prime.prime?(sum) 
     max = sum 
    end 
    end 
    i += 1 
end 

puts max 

答えて

1

(溶液2にw.r.t)素数を見つけるためにあなたの方法は正しいようです。問題はあなたのロジックです。 Nより小さい素数がp_1,p_2,..,p_kである場合、 のみの合計がp_1,p_1+p_2,p_1+p_2+p_3、... p_1+p_2+..+p_kのみであるとみなしています。 、つまりp_3+p_4から始まっていない合計はどうなりますか?

+0

私はこのような明白な間違いのようです、ありがとう! –

関連する問題