高精度阶乘

Posted 我的露娜不会飘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度阶乘相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>      
 2 #include<cstring>      
 3 using namespace std;      
 4 int main()      
 5 {      
 6     int clong=1,ans=0,n,a[100000]={0};      
 7     a[1]=1;      
 8     cin>>n;      
 9     int i,j;      
10     for(i=1;i<=n;i++)      
11     {      
12         for(j=1;j<=clong;j++)      
13         a[j]=a[j]*i;      //每次求出阶乘的值
14         for(j=1;j<=clong-1;j++)      
15         {      
16             a[j+1]+=a[j]/10; //大于10的放前面     
17             a[j]%=10;      //留下一位
18         }      
19         while(a[clong]>=10)      
20         {      
21             clong++;      
22             a[clong]=a[clong-1]/10; //大于10的放前面   
23             a[clong-1]%=10;      //留下一位
24 
25         }      
26     }      
27     for(i=clong;i>=1;i--)    
28     cout<<a[i];   
29 } 

 

为了弄懂这个代码,还是用代数的方法。。。求5!的值

I=1

 a[1]=a[1]*i=1*1=1

J=1.j<=0这个条件不满足,跳出循环

A[1]>=10这个条件不满足,跳出循环。

I=2

A[1]=a[1]*i=1*2=2

J=1.j<=0这个条件不满足,跳出循环

A[1]>=10这个条件不满足跳出循环

I=3

A[1]=a[1]*i=2*3=6

仍旧跳过两个循环

I=4

A[1]=a[1]*i=6*4=24

J=1,j<=0这个条件不满足,跳出循环

A[1]>=10.

Clong=2.a[2]=a[1]/10=2.a[1]=a[1]%10=4

A[2]=2>=10不满足条件,跳出循环

I=5

A[1]=a[1]*i=4*5=20

A[2]=a[2]*i=2*5=10

J=1.j<=1

A[2]=a[2]+a[1]/10=10+20/10=12.a[1]%10=0

A[2]=10>=10

Clong=3.a[3]=a[2]/10=12/10=1.a[2]=a[2]%10=12%10=2

A[3]=1>=10这个条件不满足,跳出循环

跳出外层循环

I=3输出a[3]=1

I=2输出a[2]=2

I=1输出a[1]=0

得到结果5!=120

这个算法就是把一个数拆成若干位存进数组a中,对于每次要乘的i,使每个数字都乘一遍i,然后在进行相除或区模运算更新值保证一个下标储存一个数字。

以上是关于高精度阶乘的主要内容,如果未能解决你的问题,请参考以下文章

关于高精度阶乘

Luogu P1009 阶乘之和

4165 ?高精度求阶乘

高精度阶乘的运算

阶乘计算 高精度

高精度高精度阶乘