Calculate 100 factorial with all the digits

Krishnachandra Sharma picture Krishnachandra Sharma · Mar 21, 2013 · Viewed 18.3k times · Source

I came across a problem of calculating 100 factorial.

Here is what I tried first in Perl to calculate 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);
}

But this is giving me 9.33262154439441e+157.

I need the answer with all of the digits.

What do I do?

Answer

mob picture mob · Mar 21, 2013

Doubles (which most Perls use) only have ~16 digits of precision. You need to use another system to get the 158 digits of precision you need.

use bigint;

This will cause Perl to automatically treat all numbers in your script as Math::BigInt objects.

If you need finer control (to treat some numbers as BigInt and some numbers as floating point) then see Krishnachandra Sharma's solution and explicitly use the Math::BigInt constructor.

Math::BigInt has a builtin factorial function, by the way:

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