2016-12-30 3 views
0

最大の素数オイラー問題に取り組んでいます。最下位のforメソッドは、要素の配列を調べ、それらが素数であるかどうかをテストすることになっています。Ruby forメソッドは、配列上をスキップしているようです。

これは小さい番号でも機能しますが、テスト番号(600851475143)では素数ではない1つの要素(104441)がありますが、forメソッドはスキップしているようです。他の非素数が削除され、実際の素数が保持されます。しかし、この1つの番号は何らかの理由でスキップされます。

私はルビーが総理メソッドを持って知っていると私は、この問題を解決するために、より説得力の方法があることを確認しています。しかし、これは本当に私を悩ましています。私はあなたの助けに感謝します。ありがとうございました。

def make_array(num) 
    array = [] 
    factors_array = [] 
    prime_array = [] 
    test_array = [] 
    x = 1 
    while x <= Math.sqrt(num) #makes array of odd numbers below square root of number 
     array << x 
     x += 2 
    end 

    array.each do |x| #gets factors of number from array 
     next if num % x != 0 
      factors_array << x 
    end 

    prime_array = factors_array 
    puts "#{prime_array} before" 
    factors_array.each do |i| #gets prime factors from factors 
     for p in 2...i #checks if numbers are prime numbers 
      if i % p == 0 
       test_array << i 
       not_prime = i 
       prime_array.delete(not_prime) 
      end 
     end   
    end 
    puts "#{test_array} test array" 
    puts "largest prime factor is = #{prime_array.max}" 
end 
make_array(600851475143) 
# answer is 104441, but it should be 6857 
+0

実際に何が起こっているのか、各ループが推奨と 'prime_array'は単にあなたがそうしている正確に何である' factors_array'への参照であるため、されていない内部 'Array'を変更するあなたはループの中にいくつかの数字をスキップしていることです。ループの後に 'factors_array'と' prime_array'で私のステートメントの外観を視覚化する(ヒント:それらは同じです)。多分試みる 'prime_array = factors_array.dup' – engineersmnky

答えて

2

問題は、このラインによって引き起こされる:両方prime_arrayfactors_array変数基準(点)同じArrayオブジェクト、この行の後

prime_array = factors_array 

prime_array.delete(not_prime)行が実行されると、factors_array.eachの反復では、次の要素がシャッフルされるため、要素をスキップします。

あなたはdupメソッドを使って配列を複製することによって、問題を解決することができます。

prime_array = factors_array.dup 

これはあなたに最初に同じアイテムを含む2つの独立したArrayのオブジェクトを参照するprime_arrayfactors_array変数を提供します。 prime_arrayArrayへの変更は、factors_arrayArray以上の繰り返しには影響しません。

+0

は必ず確認してくださいすべてのクレジットを取る:)私は私の答えを掲示した後のだ – engineersmnky

+0

@engineersmnky私はあなたのコメントを見ました。コメントの代わりに答えを書いたのであれば、私は通知を見て、取り消してしまいました(そしてあなたは信用を得ていたかもしれません)。 –

+0

ありがとうございます。それは完璧に機能し、私は何かを学びました。 – Meeses

関連する問題