项目Euler#3 Ruby

时间:2016-03-31 13:22:09

标签: ruby

任务:

  

13195的主要因素是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作为最大的素数。如果我将代码更改为:

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

我得到486847。最后印刷的阵列是:

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

我不清楚为什么我的代码不起作用。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

对于这个问题的答案,塞尔吉奥是对的。但是,当size_t f(int a[], size_t size) { size_t min_index = 0; int min_value = a[0]; for (size_t i = 1; i < size; ++i) { if (a[i] < min_value) { min_value = a[i]; min_index = i; } } return min_index; } 本身就是素数时,塞尔吉奥建议的代码(以及你的代码)将无法正常工作。

更好的写作方式是:

number

答案 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}"

答案 2 :(得分:0)

主要的lib(来自标准的lib)非常适合Project Euler。但它带来了这个乐趣:

require "prime"
600851475143.prime_division.last.first # => 6857