您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2017-01-15 23:33 183 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 nyoj