-5

我想将整数拆分为它们的因子。例如,如果记录总数为:

169 - ( 13 x 13 times) 
146 - ( 73 x 2 times) 
150 - ( 50 x 3 times)
175 - ( 25 x 7 times)
168 - ( 84 x 2 ) 
160 - ( 80 x 2 times) 

当它超过 10k - 我想要一切都在 1000 当它超过 100k - 我想要一切都在 10k

通过这种方式,我想分解数字。如何做到这一点?是否有任何 Perl 模块可用于这些类型的数字运算?

假设记录总数为 10k。它应该只拆分 1000x10 倍;不是 100 或 10 秒。

我可以使用sqrt功能。但这并不总是我所期待的。如果我输入 146,我必须得到 (73, 2)。

4

3 回答 3

5

您可以使用在 Perl 中为其他语言找到的相同算法。这些想法中没有任何 Perl 特殊的魔法。这只是实现,对于类似这个问题的问题,它可能看起来与任何语言的实现都非常相似。

你想解决什么问题?如果我们知道您要做什么,也许我们可以为您指出正确的算法:

  • 为什么超过 10,000 的数字必须使用 1,000 因子?大多数数字不会有 1,000 因子。
  • 你想要所有的因素,还是只想要最大的因素和它的伙伴?
  • 你是什​​么意思 sqrt 函数不能按你预期的那样工作?如果您遵循通用算法,您只需要迭代到平方根的下限来测试因子。大多数整数没有整数平方根。
于 2009-07-27T18:33:52.220 回答
2

如果数字不是素数,则可以使用因式分解算法。

这里有一个这样的函数的例子:http: //www.classhelper.org/articles/perl-by-example-factoring-numbers/factoring-numbers-with-perl.shtml

于 2009-07-27T12:13:56.947 回答
1

循环遍历可接受范围内的一些常见数字(例如,9 到 15),以您的测试数字为模计算余数,然后选择最小值。

sub compute_width {
    my ($total_records) = @_;
    my %remainders;
    for(my $width = 9; $width <= 15; $width += 1) {
      my $remainder = $total_records % $width;
      $remainders{$width} = $remainder;
    }
    my @widths = sort { 
      $remainders{$a} <=> $remainders{$b} || 
      $a <=> $b 
    } keys %remainders;
    return $widths[0];
}
于 2009-07-27T12:44:10.077 回答