NYOJ69 数的长度
原题地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=69
#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
int t, n;
double sum;
cin >> t;
while (t--)
{
cin >> n;
sum = 0;
for (int i=1; i<=n; i++)
sum += log10(i);
cout << (int)sum + 1<< endl;
}
return 0;
}
下面谈一谈我的思路。
在十进制数中 10^0是1位数,10^1是2位数,10^2是3位数,依此类推。对于n的阶乘n!,假设它是一个m位的数,可以确定10^(m-1)<= n! < 10^(m),因为10^(m-1)是最小的m位数, 10^(m)是最小的m+1位数。n!有m位,必将大于等于最小的m位数且小于最小的m+1位的数,对该不等式取10为底的对数有 m-1 <= log10(n!) < m。
log10(n!) = log10(n * (n-1) * (n-2) * …… * 1)
对于对数有公式:loga(m*n) = loga(m) + loga(n) 故上式可化为log10(n) + log10(n-1) + log10(n-2) + …… + log10(1)
因此通过此公式可求出log10(n!),向下取整即可求出m-1,进而得到n!的位数m。