Kri*_*rma 7 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);
}
Run Code Online (Sandbox Code Playgroud)
但是这给了我9.33262154439441e+157.
我需要所有数字的答案.
我该怎么办?
mob*_*mob 12
双打(大多数Perls使用)只有~16位精度.您需要使用另一个系统来获得所需的158位精度.
use bigint;
Run Code Online (Sandbox Code Playgroud)
这将导致Perl自动将脚本中的所有数字视为Math::BigInt对象.
如果你需要更精细的控制(将某些数字视为某些数字BigInt并将某些数字视为浮点数),请参阅Krishnachandra Sharma的解决方案并明确使用Math::BigInt构造函数.
Math::BigInt 有一个内置的阶乘函数,顺便说一下:
$ perl -MMath::BigInt -e 'print Math::BigInt->bfac(100)'
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
双打(大多数Perls使用)只有~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));
}
Run Code Online (Sandbox Code Playgroud)
产生 9332621544394415268169923e266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000