2017-04-30 14 views
0

私は987654321の階乗を計算できるプログラムを作ろうとしていますが、それを行う方法が見つかりません。Factorial Huge Number Python

def range_prod(lo,hi): 
    if lo+1 < hi: 
     mid = (hi+lo)//2 
     return range_prod(lo,mid) * range_prod(mid+1,hi) 
    if lo == hi: 
     return lo 
    return lo*hi 

def treefactorial(n): 
    if n < 2: 
     return 1 
    return range_prod(1,n) 
print(treefactorial(987654321)) 
+0

その数値は天文学的に大きいです。代わりに '階乗(54321)'のために撃ってください。 –

+1

[Stirlingの近似](https://en.wikipedia.org/wiki/Stirling's_app近似) –

答えて

0

あなたが使用できる組み込みmath.factorial

import math 
math.factorial(n) 

それとも

のPython 2.7用の階乗

from operator import mul 

を計算するreduce機能を使用することができます

は、Python 3

factorial = lambda n: reduce(mul, range(1, n+1)) 

>>> factorial(987654321) 
+0

それに幸いです。 '階乗(54321)'は233,620桁で、計算に1秒かかります。 '階乗(654321)'は数分後に戻っていません。 –

+0

@ MarkTolonenあなたは正しいですが、私は多数の階乗を見つけるより速い方法を見つけることができませんでした。しかし、場合によっては、階乗がインボリュートであっても、この値を計算する必要はありません。例えば櫛形式では、3つの階乗に関係する 'nCr = n! /((n-r)!* r!) 'したがって、1000のアイテムで2の戦闘を計算したい場合は、2つの乗算と3つの階乗と除算と乗算のすべてを必要としません。 –

+1

しかしそれは問題ではありません。 –

3

のために提案されているアプローチは計算するのに非常に長い時間がかかります。あなたには、いくつかの精度を失うことでOKなら、あなたはLogGamma機能を使用してすばやく近似値を得ることができ、例えば、

math.exp(scipy.special.gammaln(3+1)) 
=> 6.0 

scipy.special.gammaln(987654322) 
=> 19467499583.824226 

のためにそう987654321!を使用すると、桁数を見つけるためにlog 10ベースに変換することができますexp(19467499583.824226)約..です

ps。それは80億桁以上になるでしょう。