分析:n的位数等于(int)log10(n) +1
例如3的位数是(int)log10(3)+1 = 1 ,52的位数是(int)log10(52)+1 = 2
所以一个数n的阶乘的位数是:
(int)log10(n!)+1 = (int)log10(n*(n-1)*(n-2)*...*2*1)+1
= (int)(log10(n)+log10(n-1)+log10(n-2)+...+log10(2)+log10(1))+1
用C++实现的话,就是 (int)(log(n)+log(n-1)+log(n-2)+...+log(2)+log(1))/log(10)+1, 这是运用了对数的换底公式,因为C++中log(x)表示以e为底的对数,如下是简单的代码:
#include<iostream> #include<cmath> using namespace std; int main() { int n; cin>>n; double sum = 0; for(int i = 1;i<=n;i++) sum+= log((double)i)/log((double)10); cout<<int(sum)+1<<endl; }
可以发现,这个算法的时间复杂度是O(n),我们可以通过斯特林公式(Stirling's approximation)将这个算法的复杂度降低到O(1),斯特林公式如下:
下面是简单的代码实现:
#include<iostream> #include<cmath> #define PI 3.1415926 using namespace std; int main() { int n; cin>>n; double bit = 0; bit = (0.5*log(2*PI*n)+n*log((double)n)-n)/log((double)10); cout<<int(bit)+1<<endl; }