高精度阶乘以及位数

高精度阶乘

什么是高精度阶乘呢?

我们知道阶乘的变化是非常大的
就连20的阶乘都非常大了是2432902008176640000
long long 都容纳不下;
那怎么计算呢?

那我们可以借助数组来做

#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;
}

那这样的话可以求出比较大的阶乘,但超过一万的话可能会t;

那 如果让球10000后阶乘的位数呢?

我们有一个斯特林公式可以求得非常大的阶乘的位数,只需要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
今日推荐