C ++スターリング式のn!ビットを評価します

スターリング式について

式スターリングは、nの階乗を取るために使用される数式の近似です。一般的に、多くの時間をN、N-階乗の計算時には非常に大きいので、スターリング式が使用、さらには非常に若い年齢では非常に簡単であるnは、スターリング式の値が非常に正確されています。

!形態N≈SQRT(2πN)*( N / E)^ 2
両側に同時に取得式log10の単語:
log10の(N!)≈LOG10(PI] N)/ 2 + N - * log10の(N / E)

そのようなNは!切り上げのloglO後のビット数(N!)丸いアップ、すなわちLOG10(2πN)/ 2 + N * log10の(N / E)です。このレベルでは!nは計算ビットアルゴリズム、n個の大きな高精度を使用する必要がそうでない可能必要なとき。しかし、このスターリング式で、時間複雑O1レベルを減らすためだけではなく、コードも行の数を減らします。

しかし、ここでn = 0の場合、または1 = Nの場合、式スターリング値を用いて算出することだけ== 0 || N == 1 N(場合、そう日本語文を追加するために、正確ではないことに注意してください)ANS = 1。

スターリング式コード

コードは、直接式をコピーし、それはOKです。

# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;

# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)

const double E = 2.7182818284;
const double PI = 3.1415926535;

int n;

int main()
{
	scanf("%d", &n);
	int ans = ceil(log10(2 * PI * n) / 2 + n * log10(n / E));
	if(n == 0 || n == 1) ans = 1;
	printf("%d\n", ans);
	return 0;
}

神は永遠にあなたを祝福します!

公開された33元の記事 ウォン称賛47 ビュー10000 +

おすすめ

転載: blog.csdn.net/SkeletonKing233/article/details/101313184