-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 に答える