我遇到了一个名为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)
答案 0 :(得分:0)
我不打算给你完整的答案,因为这会打败Project Euler的练习对象。
然而,你几乎走在正确的轨道上,整理出你的问题。您不希望查看未清空的数组p
,这应该是收集您的素数。你确实想看看not_p
,因为这是你每个因素的除数数组。
我希望这会有所帮助。如果我能再帮忙,请告诉我。
答案 1 :(得分:0)
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