HDU 1018 Big Number (阶乘位数)
2015-06-27 18:33
387 查看
题意:
给一个数n,返回该数的阶乘结果是一个多少位(十进制位)的整数。
思路:
用对数log来实现。
举个例子 一个三位数n 满足102 <= n < 103:
那么它的位数w 满足 w = lg103 = 3。 因此只要求lgn 向下取整 +1就是位数。然后因为阶乘比如5阶乘的话是5 * 4 * 3 * 2 * 1。位数就满足lg 5 * 4 * 3 * 2 * 1 = lg5 + lg4 + lg3 + lg2 + lg1。用加法就不会超过数字上限。
当然这是十进制下得。如果是m进制下 ,就把lgn 换成logm(n)就可以了。 logm(n)的表示方法是 lgn / lgm。高中数学的知识。。 这里有个double向下取整精度的问题要注意。转换成int时候,要floor(算出来的位数 + 1e-7) + 1.
最后得出位数的计算方式为:floor( logm(n) + logm(n - 1) + ...+ logm(1) + 1e-9 ) + 1.
AC代码
给一个数n,返回该数的阶乘结果是一个多少位(十进制位)的整数。
思路:
用对数log来实现。
举个例子 一个三位数n 满足102 <= n < 103:
那么它的位数w 满足 w = lg103 = 3。 因此只要求lgn 向下取整 +1就是位数。然后因为阶乘比如5阶乘的话是5 * 4 * 3 * 2 * 1。位数就满足lg 5 * 4 * 3 * 2 * 1 = lg5 + lg4 + lg3 + lg2 + lg1。用加法就不会超过数字上限。
当然这是十进制下得。如果是m进制下 ,就把lgn 换成logm(n)就可以了。 logm(n)的表示方法是 lgn / lgm。高中数学的知识。。 这里有个double向下取整精度的问题要注意。转换成int时候,要floor(算出来的位数 + 1e-7) + 1.
最后得出位数的计算方式为:floor( logm(n) + logm(n - 1) + ...+ logm(1) + 1e-9 ) + 1.
#include <bits/stdc++.h> #define LL long long using namespace std; const int N=1e-7; int a; int second() //总位数 { double tmp=0.0; for(int i=2; i<=a; i++) tmp+=log10(i); return floor(tmp+N)+1; } int main() { //freopen("input.txt", "r", stdin); int t; cin>>t; while(t--) { scanf("%d",&a); printf("%d\n",second()); } return 0; }
AC代码
相关文章推荐
- 超级2048
- 最长公共子序列的另一类优化方法
- python单线程网络爬虫
- ffmpeg截取一段视频中一段视频
- 黑马程序员-------java语法基础
- Android 音频焦点(Audio Focus)
- 字符串的全排列详解
- cocoapods工程路径变更后library not found解决方案
- 让所有正在播放音乐的播放器主动停止播放
- hive面试题目:表大概有2T左右,对表数据转换--2
- hive面试题目:表大概有2T左右,对表数据转换
- 视图加载时自动执行铵钮事件
- 程序员的修养
- java web学习
- Android的canvas.rotate()与canvas.translate研究
- 实现类似Tumblr的Title Bar跟随滑动渐变的效果
- 动态规划--凸多边形最优三角剖分
- 获取html节点时过滤空白节点
- Cordys 流程启动与结束调用了哪些WebService
- Linux 下终端 C 语言控制光标的技巧