【问题标题】:Is there a way to find the 2 whole factors of an int that are closest together?有没有办法找到最接近的 int 的 2 个整体因素?
【发布时间】:2015-04-04 09:23:57
【问题描述】:

我是初学者,仍在向我们学习 C,但我不知道如何找到彼此最接近的 int 因子。

例如,如果输入是数字 6,则输出将是 [2,3]。如果输入为 24,则输出为 [4,6]。

有没有办法做到这一点?任何帮助将不胜感激。

【问题讨论】:

  • 提示:它们是最接近数字平方根的因子。
  • 你确定吗?例如对于数字 1111 = 11 * 101,最接近的两个因数是 1 和 11。
  • 如果输入是24,那么输出应该是[1,2],或者[2,3],或者[3,4]。

标签: c function int


【解决方案1】:

执行此操作的算法很简单;将您的数字的平方根作为整数(您要截断,而不是四舍五入)。测试该值是否是您输入的一个因素;如果是这样,您的输入除以该数字就是您的答案。否则,从之前的值中减去 1,然后重试。

在代码中(数组字面量是错误的语法,但理论是正确的):

//this code assumes that your input is > 0, will not work otherwise
function int[] getClosestFactors(int input) {
  int testNum = (int)sqrt(input);
  while (input % testNum != 0) {
    testNum--;
  }
  return {testNum, input / testNum};
}

基本上,您知道在任何一对因子中,最小的因子必须小于或等于平方根。因此,如果您从等于或小于输入平方根的整数开始倒数,您找到的第一个因子将是最接近的因子对中的较小者。这对于所有大于 0 的整数都会终止,因为您最终会达到 1,这是所有其他数字的一个因数。

【讨论】:

  • 这在 18446744073709551566 的情况下需要一点时间......恰好是 2 * 9223372036854775783,两者都是素数。不过,我猜它只有大约 4294967296 次迭代,所以不会太糟糕......当然,我能想到的另一种替代实现需要首先完全分解数字,所以它可能不会效率也好不到哪里去……
  • 对于这个数字,1 和 2 肯定是最接近的两个因子。
  • @gnasher729 我会假设(可能是错误的)1 不应该是一个有效的候选者,除非可能是素数。否则,“1 和 2”对于任何并非恰好是完美平方的偶数来说都是一个微不足道的答案......正如您已经注意到的那样,问题有点未明确的另一种方式在其他几个方面...
  • @twalberg 为了全面优化算法,我们需要更多关于预期输入分布的知识。如果不实施更复杂的算法(那时可能不会),因式分解不可能更快;我的算法实际上只是一个教科书式分解算法,它会在它找到的第一个因子上短路。
  • @gasher729 虽然操作并不完全清楚,但她的示例暗示她打算要求差异最小的“因子对”,而不是任何两个因子。这个小的澄清将完全指定预期的问题,同时还保证唯一性并与操作给出的示例保持一致。我想我已经回答了操作员打算问的问题,尽管我承认我在假设她的动机。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多