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

    

你可能感兴趣的:(number)