杭电acm 1018 Big Number
2014-02-05 13:43
351 查看
杭电acm 1018 Big Number
做本题前的引入:(1).斯特林公式(Stirling公式):lnN!=NlnN-N+0.5*ln(2*N*pi)(2).ceil函数(与之对应floor函数)
(3).log函数内必需指明类型
(4).log10(100)意义:以10为底,100为真数。
法一:
#include<iostream>
#include<cmath>
using namespace std;
const double PI=acos(-1.0);
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int num=0;
num=ceil((n*log(double(n))-n+0.5*log(double(2*PI*n)))/log(double(10)));
cout<<num<<endl;
}
return 0;
}
主要是使用了下面这个公式:
log10(n!)=log10(1*2*3…*n)=log10(1)+log10(2)+…+log10(n)
注意:
这边的result要用double值,精度比较高,我wrong了一次就因为把它设成float值了
法二:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
double sum=log10(double(n));
while(--n)
sum+=log10(double(n));
cout<<int(sum)+1<<endl;
}
}
两者相比,用斯特林公式,时间好得多(无循环)。
相关文章推荐
- 杭电acm 1018 Big Number
- 杭电ACM 1018 Big Number
- ACM--大数阶乘位数--HDOJ 1018--Big Number--水
- 杭电 1018 Big Number
- 杭电1018 Big Number
- 杭电_ACM_Big Number
- 杭电1018-Big Number(大数)
- 杭电1018 BIG NUMBER
- 杭电ACM 1017 1018 1019
- Big Number(http://acm.hdu.edu.cn/showproblem.php?pid=1018)
- 杭电1018-Big Number
- 杭电ACM OJ 1018 Big Number 两数相乘出一个大数,求大数的位数 注意log的使用
- 杭电1018 Big Number (求阶乘结果的位数)
- 杭电OJ题1018 Big Number 解题报告
- 杭电1018 Big number
- [ACM] hdoj1018 Big Number 解题报告
- 杭电1018 Big Number
- 杭电 HDU ACM 1018 Big Number
- 杭电OJ——1018 Big number!
- 杭电 ACM 1018