任务:
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]
我不清楚为什么我的代码不起作用。有人可以帮忙吗?
答案 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