1. 程式人生 > >高精度階乘

高精度階乘

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,然後在進行相除或區模運算更新值保證一個下標儲存一個數字。

高精度階乘