杭电1018 BIG NUMBER
求阶乘的位数
这题要求n的阶乘的位数,如果n较大时,n的阶乘必将是一个很大的数,题中说1<=n<10000000,当n=10000000时可以说n的阶乘将是一个非常巨大的数字,对于处理大数的问题,我们一般用字符串,这题当n取最大值时,就是一千万个数字相乘的积,太大了,就算保存在字符串中都有一点困难,而且一千万个数字相乘是会涉及到大数的乘法,大数的乘法是比较耗时的,就算计算出结果一般也会超时。这让我们不得不抛弃这种直接的方法。
任意一个正整数n的位数等于(int)log10(n) + 1;
A=n!=1*2*3*……*n
A的位数:(int)log10(A) + 1
log10(A)=log10(1*2*3*……n)
(根据log10(a*b) = log10(a) + log10(b))
log10(A) =log10(1)+log10(2)+log10(3)+……+log10(n)
So, n的阶乘的位数等于
(int)(log10(1)+log10(2)+log10(3)+……+log10(n)) + 1
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
int i;
double result=0;
cin>>x;
for(i=1;i<=x;i++)
{
result+=log10(i);
}
cout<<(int)result+1<<endl;
}
return 0;
}
需要注意的就是,result应定义为double类型,输出的时候再强制转换为int