7

100階乗を計算する問題に遭遇しました。

これが私が最初にPerlで100を計算しようとしたことです!:

#!/usr/bin/perl

use strict;
use warnings;
use Math::BigInt;

my $n=<>;
chomp($n);
print fac($n);

sub fac
{
    my ($m) = @_;

    return 1 if($m <=1 );
    return $m*fac($m-1);
}

しかし、これは私に与えています9.33262154439441e+157

すべての数字で答えが必要です。

私は何をしますか?

4

3 に答える 3

12

Doubles(ほとんどのPerlが使用)の精度は最大16桁です。必要な158桁の精度を得るには、別のシステムを使用する必要があります。

use bigint;

これにより、Perlはスクリプト内のすべての数値をMath::BigIntオブジェクトとして自動的に処理します。

より細かい制御が必要な場合(一部の数値を浮動小数点として扱いBigInt、一部の数値を浮動小数点として扱うため)、Krishnachandra Sharmaのソリューションを参照して、Math::BigIntコンストラクターを明示的に使用してください。

Math::BigIntちなみに、階乗関数が組み込まれています。

$ perl -MMath::BigInt -e 'print Math::BigInt->bfac(100)'
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
于 2013-03-21T18:46:03.523 に答える
6

Doubles(ほとんどのPerlが使用)の精度は最大16桁です。必要な158桁の精度を得るには、別のシステムを使用する必要があります。を使用してみてくださいMath::BigInt

これがコードです。

#!/usr/bin/perl

use strict;
use warnings;
use Math::BigInt;


my $n=100;
Math::BigInt->new($n);
print fac($n);

sub fac
{
    my ($m) = @_;

    return 1 if($m <=1 );
    return Math::BigInt->new($m*fac($m-1));
}

生産する9332621544394415268169923e266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

于 2013-03-21T18:40:27.163 に答える
0

定義上、bigint整数および浮動小数点リテラルの処理をオーバーロードし、それらをMath::BigIntオブジェクトに変換することによって機能します。したがって、単純なforループの助けを借りて、非常に大きな整数の階乗を実現できます。

use bigint;

my $fact = 1;

for my $n (1..100) {    
    $fact *= $n;
}

print "Factorial: \n", $fact , "\n";

これにより、以下の出力が生成されます。

Factorial: 933262154439441526816992388562667004907159682643816214685929638952175
99993229915608941463976156518286253697920827223758251185210916864000000000000000
000000000

一方、このような通常のプログラムは、意味のある出力なしで震えます

use integer;

my $fact = 1;

for my $n (1..100) {    
    $fact *= $n;
}

print "Factorial: \n", $fact , "\n";

出力:

Factorial:
0
于 2015-10-16T12:04:32.103 に答える