Perl 用所有数字计算100阶乘

Perl 用所有数字计算100阶乘,perl,factorial,bigint,Perl,Factorial,Bigint,我遇到了一个计算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); } #/usr/bin/perl 严格使用;

我遇到了一个计算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);
}
#/usr/bin/perl
严格使用;
使用警告;
使用Math::BigInt;
我的$n=;
咀嚼(n美元);
打印传真(n美元);
副fac
{
我的($m)=;
如果($mdouble)(大多数人使用)只有~16位精度,则返回1。您需要使用另一个系统才能获得所需的158位精度。请尝试使用

这是代码

#!/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));
}
!/usr/bin/perl
严格使用;
使用警告;
使用Math::BigInt;
我的$n=100;
数学::BigInt->new($n);
打印传真(n美元);
副fac
{
我的($m)=;
返回1个if($m新($m*fac($m-1));
}
产生的
933262154439415268169923E2667004907159682643816246614685929638952175993229916089146397615651828625369792208223758251185210916864000000000000000000
双精度(大多数Perls使用)只有约16位精度。您需要使用另一个系统来获得所需的158位精度

use bigint;
这将导致Perl自动将脚本中的所有数字视为
Math::BigInt
对象

如果您需要更精细的控制(将一些数字视为
BigInt
,将一些数字视为浮点),请参阅Krishnachandra Sharma的解决方案,并显式使用
Math::BigInt
构造函数

Math::BigInt
有一个内置的阶乘函数,顺便说一下:

$ perl -MMath::BigInt -e 'print Math::BigInt->bfac(100)'
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

根据定义,
bigint
通过重载整数和浮点文本的处理,将它们转换为Math::bigint对象来工作。因此,借助simple
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