高精度阶乘

 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,然后在进行相除或区模运算更新值保证一个下标储存一个数字。

posted @ 2018-03-10 11:11  我的露娜不会飘  阅读(115)  评论(0编辑  收藏  举报