2013-03-21 6 views
7

계승을 계산하는 문제가 발생했습니다.모든 자릿수로 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을주고있다.

모든 숫자와 함께 답이 필요합니다.

어떻게해야합니까?

답변

12

복식를 생성합니다. 158 자리의 정밀도를 얻으려면 다른 시스템을 사용해야합니다.

use bigint; 

이렇게하면 Perl이 자동으로 스크립트의 모든 숫자를 Math::BigInt 개체로 처리합니다.

일부 수치를 BigInt으로 취급하고 일부 숫자를 부동 소수점으로 처리하려면 Krishnachandra Sharma의 솔루션을 참조하고 명시 적으로 Math::BigInt 생성자를 사용해야합니다.

Math::BigInt는 방법으로하는 내장 계승 기능이 있습니다

$ perl -MMath::BigInt -e 'print Math::BigInt->bfac(100)' 
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 
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)); 
} 

는 ~ (대부분의 Perls가 사용하는)만을 가지고 정밀도의 16 개 자리를 9332621544394415268169923e266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

0
정의에

, 수학 ::의 BIGINT 객체로 변환, 정수 처리 과부하 및 소수점 리터럴 부동하여 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