题目描述:
求n的阶乘的位数。
题目类型:
利用数学思维。
解题思路:
由于n的阶乘数太大了,不能直接算,所以将n的阶乘的位数转化为 10^M,因此只要求出 M+1 即可。两边取对数,算就行了。
源代码:
方法一:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a;
double sum;
while(n--)
{
sum=1;
cin>>a;
for(int i=1;i<=a;i++)
sum=sum+log10(i);
cout<<(int)sum<<endl;
}
return 0;
}
方法二:
介绍一个数学公式,斯特林公式:
n! ~ sqrt ( 2 * pi * n) ( n / e ) ^ n .
以后遇到与阶乘相关的运算时,可以考虑该公式。
源代码:
#include<iostream>
#include<math.h>
using namespace std;
const double PI=3.14159265;
int main()
{
int n;
cin>>n;
int a;
double sum;
while(n--)
{
cin>>a;
sum=(a*log(a)-a+0.5*log(2*PI*a))/log(10)+1; //两边取e为底的对数。
cout<<(int)sum<<endl;
}
return 0;
}
解题参考 http://blog.youkuaiyun.com/hondely/article/details/5777495 。