高精度阶乘以及位数

高精度阶乘

什么是高精度阶乘呢?

我们知道阶乘的变化是非常大的
就连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;
	}

由此就可以得到很大的阶乘的位数;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛郎恋刘娘,刘娘念牛郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值