试图在没有递归的情况下解决最大的素因子 - Ruby

时间:2015-01-13 04:42:37

标签: ruby loops if-statement

我遇到了一个名为Project Euler的网站,一切顺利,直到我遇到第三个问题 - 最大的素数因素。我不想使用递归来解决它。我在网上看到他们使用Math.sqrt的解决方案,我也不想使用它。顽固,我知道。

我想用loop和if语句来解决它。我假设输入是一个奇数。这是我的代码。如果num = 99,输出仍然以[3]出现,我无法弄清楚原因。我尝试在各处放置一个puts语句,以查看每一步输出的内容。我意识到的一个问题是每个循环后数组#p没有重置。我试过array.clear,但这没有多大帮助。有人能指出我正确的方向吗?关于我没有得到的数组,循环和if语句是否有一些基本方面?

def prime(num)
    arr = []
    p = []
    not_p = []
    # first I find all the numbers that num is divisible by
    for i in (2..num/2) 
        if num % i == 0
             arr << i
        end
    end # this should output [3, 9, 11, 33]

    arr.each do |x| #  I loop through each element in the above array
        for i in (2..(x/2)) # I divide each element - x -  by 2 because it cannot be divisble by anything greater than its half
            if x % i == 0 # if x is divisble by i
                not_p << i # I push the i into array#not_p
            end # keep looping until i reaches x/2
        end
        if not_p.length == 0 # if there are no values in array#not_p, then I know x is a prime factor
            p << x # so I push x into array#p
        end  
    end
    return p[-1] # returns the last element of the array, which is the largest
end

puts prime(99)

2 个答案:

答案 0 :(得分:0)

我不打算给你完整的答案,因为这会打败Project Euler的练习对象。

然而,你几乎走在正确的轨道上,整理出你的问题。您不希望查看未清空的数组p,这应该是收集您的素数。你确实想看看not_p,因为这是你每个因素的除数数组。

我希望这会有所帮助。如果我能再帮忙,请告诉我。

答案 1 :(得分:0)

好的,好的!谢谢philnash的建议!事实上,我知道这个问题,并试图用Array.clear清除数组,但这不起作用。相反,我只是在迭代arr.each do | x |下面移动了not_p = []它工作了!这是有道理的,因为not_p在移动到下一个元素时会重置为[]。非常感谢您的帮助,并且没有先提供答案!这是我的最终工作解决方案= D

def prime(num)
    arr = []
    p = []

    for i in (2..num / 2)   
        if num % i == 0
             arr << i
        end
    end # this should output [3, 9, 11, 33]

    arr.each do |x| 
        not_p = []
        for i in (2..(x / 2)) 
            if x % i == 0 
                not_p << i 
            end 
        end
        if not_p.length == 0 
            p << x 
        end
    end
    return p[-1] 
 end

puts prime(99) # => 29