Вычислить 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