我遇到了计算 100 factorial 的问题。
以下是我首先在 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
。
我需要所有数字的答案。
我该怎么办?
答案 0 :(得分:12)
双打(大多数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
答案 1 :(得分:6)
双打(大多数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));
}
制作9332621544394415268169923e266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
答案 2 :(得分: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