hdu 1018 Big Number 数学

来源:互联网 发布:用友沙盘模拟软件 编辑:程序博客网 时间:2024/05/21 06:56

难度:2

很好玩

题意:求n!阶乘的数的位数。
方法一:log10(n!)=log10(1)+log10(2)+…..+log10(n);

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;int main() {    int T , n;    scanf("%d" , &T);    while(T--) {        scanf("%d" , &n);        double ans = 0;        for(int i=2;i<=n;i++) {            ans += log10( (double) i );        }        int res = (int)ans + 1;        printf("%d\n" , res);    }    return 0;}

方法二: 由斯特林[striling]公式可得:lnN!=NlnN-N+0.5ln(2N*pi)
而N的阶乘的位数等于:log10(N!)取整后加1

代码2:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;#define pi acos(-1.0)//lnN!=NlnN-N+0.5ln(2N*pi)int main() {    int T;    double n;    scanf("%d" , &T);    while(T--) {        scanf("%lf" , &n);        double ans = (n * log(n) - n + 0.5 * log(2 * n * pi)) / log(10);        printf("%d\n" , (int)ans + 1);    }    return 0;}


0 0
原创粉丝点击