大数連乗はいくつかの数学の問題を解決します

8035 ワード

一.問題の説明
  n!あるいはc(n,m)=n*......(n-m+1)/n!あるいはp(n,m)=n*......(n−m+1)であり,これらの問題はすべて連乗によって解決できる.
二.注意事項:
小数の組み合わせ数は劉汝佳のように(ans=ans*b/a)、10^num=n!で判断(log 10(n!))することができます.階段乗の桁数(num+1);
階乗に各配列要素に複数のビットが格納されている場合(中間結果オーバーフローの問題に注意が必要)、出力にはprintf("%5 d")が必要です.
階乗の中間結果がオーバーフローするかどうか:例えば2000の階乗では、この「a[k]=a[k]*j+w」がオーバーフローする可能性があります.数値解析を格納すると,a[k]最大9,j最大1999,w最大9,オーバーフローしない.
三.プログラムコード
  
 1 void liancheng(int m,int n)//n>m,      

 2 {

 3     memset(a,0,sizeof(a));

 4     int temp = n;

 5    //    m     a,      

 6    int i = 0;//        

 7     while(temp>0)

 8     {

 9         a[i++] = temp%10;

10         temp/=10;

11     }

12     

13     for(int j=n-1; j>=m;j++)

14     {

15         int w = 0;//   

16         for(k=0; k<i; k++)

17         {

18             a[k] = a[k]*j + w;

19             w = a[k]/10;

20             a[k]%=10;

21         }

22         //       

23         while(w>0)

24         {

25             i++;

26             a[i] = w%10;

27             w /= 10;

28         }

29     }  

30 }
 1 //        n!  

 2 memset(b,0,sizeof(b));

 3 for(int t=2; t<=n; t++)

 4 {

 5     int s = 0;//s   

 6     //   for               

 7     for(int p=i; p>=0; p--)//      

 8     {

 9         s = s*10 + a[p];//   a[p] = a[p]*10 + s;

10         b[p] = s/t;//  ,b          

11         s %= t;

12     } 

13     

14     //

15     while(b[i]==0)//   while(b[i])          

16         i--;//            

17     

18     //  b  i     ,     0

19     //     ,             a   

20     for(int r=0; r<i; r++)//      

21         a[r] = b[r]; 

22 } 
1 //    

2 for(int q=i; q>=0; q--)

3     cout<<a[q]; 

四.終わりの言葉
私のレベルが限られているため、漏れは避けられないが、大牛が教えてくれることを望んでいる......HPU張朋飛拝上(QQ:791909235)