Big Number

问题陈述:

  杭州电子科技大学 HANGZHOU DIANZI UNIVERSITY Online Judge Problem - 1018

 

问题解析:

  公式一:

    n! = 10^m => lg(10^m) = lg(n!) => m = lg(n) + lg(n-1) + lg(n-2) + ... + lg1;

    所以digits = (int)m + 1;

   公式二:stirling公式

    n! ≈ √2PIn(n/e)n                         

    化简:lg(n!) = 1/2lg(2*PI*n) + nlg(n/e);

 

代码详解:

I:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int i, n, t, digits;
10     double m;
11     cin >> n;
12     while(n--) {
13         m = 0;
14         cin >> t;
15         for(i=1; i<=t; i++) {
16             m += log10(i*1.0);
17         }
18         digits = (int)m + 1;
19         cout << digits << endl;
20     }
21     return 0;
22 }

II:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n, t, digits;
10     double PI = acos(double(-1));
11     double e = exp(double(1));
12     cin >> n;
13     while(n--) {
14         cin >> t;
15         digits = (int)(0.5*log10(2*PI*t) + t*log10(t/e)) + 1;
16         cout << digits << endl;
17     }
18     return 0;
19 }

 

 转载请注明出处:http://www.cnblogs.com/michaelwong/p/4287232.html

    

posted @ 2015-02-12 01:34  HelloMichaelWong  阅读(295)  评论(0编辑  收藏  举报