HDU 1018 阶乘的位数 stirling公式
2012-07-24 20:53
337 查看
用Stirling公式计算n!结果的位数时,可以两边取对数,得:
log10(n!) = log10(2*PI*n)/2+n*log10(n/E);
故n!的位数为 log10(2*PI*n)/2+n*log10(n/E)+1(注意:当n=1时,算得的结果为0)
n的位数为[lg10(n)]+1
n!的位数为[lg10(n*(n-1)*(n-2)*…..*1)]+1=[lg10(n)+lg10(n-1)+lg10(n-2)+….+lg10(1)]+1
直接取LOG
用stirling公式 968ms-->15ms
log10(n!) = log10(2*PI*n)/2+n*log10(n/E);
故n!的位数为 log10(2*PI*n)/2+n*log10(n/E)+1(注意:当n=1时,算得的结果为0)
n的位数为[lg10(n)]+1
n!的位数为[lg10(n*(n-1)*(n-2)*…..*1)]+1=[lg10(n)+lg10(n-1)+lg10(n-2)+….+lg10(1)]+1
直接取LOG
#include<stdio.h> #include<math.h> int main() { int t; scanf("%d",&t); while(t--) { int n,i; double sum=0; scanf("%d",&n); for(i=1;i<=n;i++) { sum+=log10(double(i)); } printf("%d\n",(int)(sum)+1); } return 0; }
Accepted | 1018 | 968MS | 200K | 317 B |
Accepted | 1018 | 15MS | 204K | 357 B |
#include<stdio.h> #include<math.h> int stirling(int n) { double PI=acos(double(-1)); double e=exp(double(1)); return int(log10(sqrt(2*PI*n))+n*log10(n/e))+1; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); printf("%d\n",stirling(n)); } return 0; }
相关文章推荐
- hdu 1018 -Big Number(求n的阶乘的位数)
- hdu 1018 Big Number(求阶乘的位数)
- HDU 1018 求阶乘的位数
- hdu 1018 Big Number (求一个数的阶乘的位数,公式!!!)
- hdu 1018 计算一个数阶乘的位数
- HDU 1018 Big Number【阶乘位数】
- hdu 1018 Big Number (求一个数的阶乘的位数,公式!!!)
- hdu1018大数阶乘的位数,斯特林数的各种应用
- hdu 1018 阶乘位数
- HDU 1018 Big Number(阶乘位数计算)
- HDU_1018_n(1e7)的阶乘的结果的位数
- hdu(1018)Big Number(阶乘位数的计算)
- HDU 1018 Big Number (阶乘位数)
- hdu 1018 求大数阶乘位数有公式
- hdu 1018 Stirling 求阶乘位数
- HDU--1018--Big number!(计算阶乘结果的位数)
- HDU1018 Big Number(求阶乘位数)
- HDU1018_求数的阶乘位数
- hdu1018——Big Number(大数阶乘,斯特林公式)
- HDU1018 Big Number n!的位数