Calculate 100 factorial with all the digits

18,413

Solution 1

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

Solution 2

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

Here is the code.

#!/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));
}

Produces 9332621544394415268169923e266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Share:
18,413

Related videos on Youtube

Krishnachandra Sharma
Author by

Krishnachandra Sharma

I am a Perl/C++ developer.

Updated on June 04, 2022

Comments

  • Krishnachandra Sharma
    Krishnachandra Sharma almost 2 years

    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?

Related