数的长度【南阳 oj 题目69】
2017-08-09 18:33
246 查看
点击打开链接
描述
N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?
输入首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
输出对于每个数N,输出N!的(十进制)位数。
样例输入
样例输出
题解一:直接利用斯特林公式
s=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );(n>1)
题解二:设n!<=10^m,两边同时取对数可得m = log10^1+log10^2+log10^3...+log10^n,
然后利用for循环求m的值(n值过大可能会超时)
描述
N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?
输入首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
输出对于每个数N,输出N!的(十进制)位数。
样例输入
3 1 3 32000
样例输出
1 1 130271
题解一:直接利用斯特林公式
s=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );(n>1)
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int main() { int t,n,s; cin>>t; while(t--) { cin>>n; if(n==1) cout<<"1"<<endl; else { s=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 ); cout<<s<<endl; } } return 0; }
题解二:设n!<=10^m,两边同时取对数可得m = log10^1+log10^2+log10^3...+log10^n,
然后利用for循环求m的值(n值过大可能会超时)
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int main() { int n; cin>>n; while(n--) { int m,s; double t=1; cin>>m; for(int i=1;i<=m;i++) t=t+log10(i); s=(int)t; cout<<s<<endl; } return 0; }
相关文章推荐
- 南阳oj 题目32 组合数
- NYOJ题目69-数的长度(斯特林算法)
- 南阳OJ 题目24:素数距离问题
- 南阳oj 题目66 分数拆分
- 南阳 oj 语言入门 Coin test 题目204
- 南阳oj题目35 表达式求值【栈的应用】
- 南阳oj 郁闷的c小加(二) 题目267
- 华为OJ题目(五):字符串最后一个单词的长度
- 南阳oj 求逆数 题目117
- 第十五周Oj题目按长度截取字符串
- 南阳oj 题目60 谁获得了最高奖学金
- 南阳oj 题目97 兄弟郊游问题
- 南阳oj 表达式求值 题目305 数据结构
- 南阳oj 题目 488 素数环
- 南阳oj 题目115 城市平乱 迪杰斯特拉
- 南阳 69 数的长度
- 南阳OJ——题目260:数数小木块
- 南阳OJ 题目64:小学生算术
- 南阳oj 题目477 A+B Problem III
- 南阳oj 题目100 1的个数