2016-03-31 6 views
-3

タスク:13195のプロジェクトオイラー#3ルビー

素因数ある5、7、13、29 番号600851475143の最大の素因数は何ですか?

正解は6857です。

マイコード:上記の場合

def prime?(n) 
    (2..(n-1)).each { |x| false if n % x == 0 } 
    true 
end 

x = 2 
prime_factor_arr = [] 
number = 600_851_475_143 

while x < number 
    if number % x == 0 && prime?(x) 
    prime_factor_arr << x 
    number = number/x 
    end 
    x += 1 
end 

puts prime_factor_arr.last 
puts prime?(prime_factor_arr.last) 
puts prime_factor_arr 

、私は最大の素数として1471を取得します。コードを次のように変更した場合:最後に印刷された配列は以下のとおりです。

[71, 839, 1471, 6857, 59569, 104441, 486847] 

私のコードが動作しない理由が私には明確ではありません。誰も助けてくれますか?

+3

あなたの 'プライム 'は_all_の数値に対して' true'を返すと思いますか? –

+1

ルビーエキスパートではありませんが、 'prime?'関数は常にtrueを返すようです。たとえば、486847はプライムではありません。 – Bort

+0

感謝します! Ok。ちょうど 'false'の代わりに' return false'を追加しました。メソッドを終了したい場合は、 'return'を特にタイプする必要があることを正しく理解していますか? –

答えて

1

質問に対する答えとして、セルジオは正しいです。しかし、numberがプライムそのものである場合、Sergioが示唆するコード(あなただけでなく)は正しく動作しません。書き込みに

良い方法は次のとおりです。

def prime?(n); (2...n).none?{|x| n.%(x).zero?} end 

number = 600_851_475_143 

number.downto(1).find{|x| number.%(x).zero? and prime?(x)} 
+0

ああ、「%(x).zero?」は境界線が醜いです:) –

+0

@SergioTulentsevあなたはそれを言うつもりだと思いました。私のためではない。 – sawa

+1

ええ、あなたの答えも速くなります。私は 'プライム 'を修正しただけで、残りはチェックしなかった。 –

0

はこれを試してみてください。

def prime? n 
    (2..(n-1)).each { |x| return false if n % x == 0 } 
    true 
end 

n = 600_851_475_143 
a = [] 
product_sum = 1 
x = 2 # 2 is the first prime number 

while product_sum < n 
    if n % x == 0 && prime?(x) 
     a << x 
     product_sum *= x 
    end 
    x += 1 
end 

puts "The answer is #{a.last}" 
0

プライムライブラリ(標準ライブラリから)は、プロジェクトオイラーにとって非常に便利です。しかし、それは楽しいものです:

require "prime" 
600851475143.prime_division.last.first # => 6857 
関連する問題