【发布时间】:2015-09-14 17:57:32
【问题描述】:
我正在尝试创建一个返回给定数字的最小素数的函数:
require 'prime'
def findSmallestPrimeFactor(number)
return 2 if number.even?
return number if Prime.prime? number
arrayOfFactors = (1..number).collect { |n| n if number % n == 0 }.compact
arrayOfFactors.each { |n| arrayOfFactors.pop(n) unless Prime.prime? n }
return arrayOfFactors[0]
end
findSmallestPrimeFactor(13333) 应该返回67,而是返回1,这不应该发生,因为1 应该在第7 行从arrayOfFactors 中删除,因为Prime.prime? 1 返回false
它有时什么也不返回:
puts findSmallestPrimeFactor(13335) # => returns empty line
此问题仅在处理非偶数且非质数时出现,即忽略第 4 行和第 5 行。
另外,完成后,我将通过它传递一些非常大的数字。对于较大的数字,是否有任何更短或更有效的方法来执行第 6-8 行?
【问题讨论】:
-
在迭代过程中修改数组会变得很棘手。在大多数情况下,您会得到意想不到的结果,您就是这种情况。此外,
pop在末尾删除了一个元素,与您当前正在迭代的元素无关。 -
我知道这一点。有没有办法在不修改数组的情况下做同样的事情?
-
清楚地说明示例和您的预期结果,而不是提供即使您自己也知道已损坏的代码。
-
我会尝试类似:从 2 到数字循环,并在它是素数时返回数字和
arg % n == 0