大数連乗はいくつかの数学の問題を解決します
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,オーバーフローしない.
三.プログラムコード
四.終わりの言葉
私のレベルが限られているため、漏れは避けられないが、大牛が教えてくれることを望んでいる......HPU張朋飛拝上(QQ:791909235)
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)