【问题标题】:Finding smallest prime factor寻找最小的主要因素
【发布时间】: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

标签: ruby primes


【解决方案1】:

由于您使用的是prime 库,它有一个prime_division 方法:

require 'prime'

13335.prime_division
# => [[3, 1], [5, 1], [7, 1], [127, 1]]
13335.prime_division[0][0]
# => 3

【讨论】:

  • 哈哈,谢谢!我确实使用Prime.prime_division n 尝试过这个,但由于某种原因它不起作用。不过,这行得通。
【解决方案2】:

如果 Prime.prime?为 1 为假,它将失败“如果”并继续。尝试使您的数组从 3..sqrt(number)... 开始,这将排除 1,并且您已经确定该数字是奇数,所以也省略 2,当然没有必要查看高于平方根; (因为因子总是成对出现 a*b=n,其中 a 和 b 是因子;在平方根的情况下,a = b... 在所有其他情况下,一个小于,另一个大于,平方根)。

另外,与其收集整个集合,不如考虑一个常规循环,它会在找到主要因素的瞬间短路:如果您想要的只是最小的,为什么要找到所有因素? (例如,对于 3333,您可以快速找出最小的质因数是 3,但要找到所有因数会做更多的步骤)。

【讨论】:

  • "当然也没有必要看任何高于平方根的东西。"我一直听到这个,好像这是世界上最明显的事情,但我不明白。你能解释一下为什么我不需要检查平方根吗?
  • 我修改了答案解释一下。
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多