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的长度,那么n!长度,于是我们可以利用对数函数的运算法则将乘法变为对数函数的加法,即,解决了溢出同时复杂度降为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;
}