51nod 1058 - N的阶乘的长度 - 简单数论

1058 N的阶乘的长度

Time Limit: 1000 MS                                    Memory Limit: 131,072.0 KB

题目描述 

输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。

输入

输入N(1 <= N <= 10^6)

输出

输出N的阶乘的长度

输入样例

6

输出样例

3

题目分析

首先我们要知道13的阶乘就会爆int(int的数据范围为-2147483648~2147483647),21的阶乘就会爆long long(long long的数据范围是 -9223372036854775808~9223372036854775807),显然不能直接算阶乘,如果用数据模拟乘法,一次乘法复杂度为n平方,n - 1次乘法复杂度就是n立方,显然超时。

但我们知道一个数n的长度len = log_{10}n + 1,那么n!长度len = log_{10}(1*2*3*...*n) + 1,于是我们可以利用对数函数的运算法则将乘法变为对数函数的加法,即len = log_{10}1 + log_{10}2 + log_{10}3 + ...+log_{10}n + 1,解决了溢出同时复杂度降为O(n)

注意上述等式成立是忽略了log的精度,在现实中我们是要考虑精度的,只是10^6相对与浮点数的精度而言可以忽略不记(不会溢出),因此我们不用去考虑精度损失。

代码

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n;
    cin >> n;
    double ans = 1;
    for (int i = 1; i <= n; ++ i){
        ans += log10(i);
    }
    cout << (int)ans << endl;
    return 0;
}
发布了21 篇原创文章 · 获赞 0 · 访问量 821

猜你喜欢

转载自blog.csdn.net/tourist1412/article/details/105040191