高精度階乘
阿新 • • 發佈:2018-03-10
clu span sin 循環 代數 更新 pan ace 方法
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,然後在進行相除或區模運算更新值保證一個下標儲存一個數字。
高精度階乘