欢迎使用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。
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器ss
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器