处理最大的素数欧拉问题。底部的for方法应该通过一系列因子并测试它们是否为素数。
它适用于较小的数字,但对于测试编号(600851475143),有一个因素(104441)不是素数,但for方法似乎跳过它。删除其他非素数并保留实数。但由于某种原因,这一个数字开始被跳过。
我知道ruby有一个Prime方法,我相信有更多有说服力的方法来解决这个问题。但这一直困扰着我。我感谢您的帮助。谢谢。
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 :(得分:2)
问题是由这一行引起的:
prime_array = factors_array
在此行之后,prime_array
和factors_array
变量都引用(指向)相同的Array
对象。当prime_array.delete(not_prime)
行执行时,factors_array.each
次迭代将跳过一个因子(因为下一个因素会被洗牌)。
您可以使用dup
方法复制数组来解决问题:
prime_array = factors_array.dup
这将为您提供prime_array
和factors_array
个变量,引用最初包含相同项目的两个独立Array
个对象。对prime_array
Array
的修改不会影响factors_array
Array
上的迭代。