Ruby for方法似乎在遍历数组时跳过

时间:2016-12-30 18:52:43

标签: arrays ruby for-loop

处理最大的素数欧拉问题。底部的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

1 个答案:

答案 0 :(得分:2)

问题是由这一行引起的:

prime_array = factors_array

在此行之后,prime_arrayfactors_array变量都引用(指向)相同的Array对象。当prime_array.delete(not_prime)行执行时,factors_array.each次迭代将跳过一个因子(因为下一个因素会被洗牌)。

您可以使用dup方法复制数组来解决问题:

prime_array = factors_array.dup

这将为您提供prime_arrayfactors_array个变量,引用最初包含相同项目的两个独立Array个对象。对prime_array Array的修改不会影响factors_array Array上的迭代。