高精度の階乗とビット数

高精度階乗

高精度階乗とは何ですか?

階乗の変化が非常に大きいことはわかっていますが
、20の階乗でさえ非常に大きく、
長さは2432902008176640000です。
どのように計算するのですか?

次に、配列の助けを借りてそれを行うことができます

#include<bits/stdc++.h>
using namespace std;
#define IN -1e6
#define INT 1e6
const int maxn=1e6;
int res=1;
typedef long long ll;
int a[maxn];

int main()
{
    
    
	a[0]=1;
  int n,jin=0,w=1,s; ///jin表示进位 , w代表位数
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    
    
  	jin=0;
  	   for(int j=0;j<w;j++)
  	   {
    
    
  	   	   s=a[j]*i+jin;
  	   	   jin=s/10;
  	   	   a[j]=s%10;
	   }
	   
	   while(jin)
	   {
    
    
	   	 a[w++]=jin%10;
	   	 jin/=10;
	   }
  }
  
  for(int i=w-1;i>=0;i--)
  {
    
    
  	cout<<a[i];
  }
   return 0;
}

この場合、比較的大きな階乗を取得できますが、10,000を超える場合は、tになる可能性があります。

ボールが10,000になった後の階乗の桁数はどうですか?

非常に多くの階乗を見つけることができるスターリングの公式がありますが、o(1)だけです。

ここに画像の説明を挿入
ここに画像の説明を挿入
次に

const double e = 2.7182818284590452353602875;

const double PI = 3.1415926535897932384626434;//越精确越好
int main() {
    
    
	int n, N;
	cin >> n;
	while (n--) {
    
    
		cin >> N;
		cout << int(0.5 * log10(2 * PI * N) + N * log10(N / e)) + 1 << endl;
	}

これから、多数の階乗ビットを取得できます。

おすすめ

転載: blog.csdn.net/qq_52172364/article/details/112133131