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