欢迎使用CSDN-markdown编辑器

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值