7

我遇到了计算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的。

我需要所有数字的答案。

我该怎么办?

4

3 回答 3

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
于 2013-03-21T18:46:03.523 回答
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

于 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 回答