Вычислить 100 факториалов со всеми цифрами

я столкнулся с проблемой вычисления 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.

мне нужен ответ со всеми цифрами.

что мне делать?

3 ответов


двойники (которые используют большинство Perls) имеют только ~16 цифр точности. Вам нужно использовать другую систему, чтобы получить 158 цифр точности вам нужно.

use bigint;

это заставит Perl автоматически обрабатывать все числа в вашем скрипте как Math::BigInt объекты.

Если вам нужен более точный контроль (для обработки некоторых чисел как BigInt и некоторые числа в качестве плавающей точки), затем см. решение Кришначандры Шармы и явно используйте Math::BigInt конструктор.

Math::BigInt имеет встроенную факториальную функцию, кстати:

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

двойники (которые используют большинство 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


по определению bigint работает путем перегрузки обработки целочисленных и литералов с плавающей запятой, преобразования их в объекты Math::BigInt. Так что с помощью simple for loop мы можем достичь факториала очень больших целых чисел.

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