高精度階乗
高精度階乗とは何ですか?
階乗の変化が非常に大きいことはわかっていますが
、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;
}
これから、多数の階乗ビットを取得できます。