杭电acm 1018 Big Number
做本题前的引入:(1).斯特林公式(Stirling公式):lnN!=NlnN-N+0.5*ln(2*N*pi)
(2).ceil函数(与之对应floor函数)
(3).log函数内必需指明类型
(4).log10(100)意义:以10为底,100为真数。
法一:
#include<iostream>
#include<cmath>
using namespace std;
const double PI=acos(-1.0);
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int num=0;
num=ceil((n*log(double(n))-n+0.5*log(double(2*PI*n)))/log(double(10)));
cout<<num<<endl;
}
return 0;
}
法二:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
double sum=log10(double(n));
while(--n)
sum+=log10(double(n));
cout<<int(sum)+1<<endl;
}
}
两者相比,用斯特林公式,时间好得多(无循环)。