hdu 1018(数学)

编辑器加载中

/*
由斯特林[striling]公式可得:
lnN!=NlnN-N+0.5ln(2N*pi)
log10(N!)=lnN!/ln(10)
一个数字的位数,由对数来求。
log10() // 求以10为底的对数
log() // 以e为底的对数
*/
//数学题
#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;

const double PI = 3.14159265;

int main() {
int t;
scanf ("%d", &t);
while (t--) {
int n;
scanf ("%d", &n);//斯特林公式
double digit = (n * log(n) - n + 0.5 * log(2*n*PI)) / log(10);
printf ("%d\n", (int)digit+1);
}
return 0;
}
n!位数=log10(n!)+1,而log10(n!) = log10(1)+log10(2)+...+log10(n)
//390MS
#include <math.h>
#include <stdio.h>

int main() {
int t, i, n;
double digit;
scanf ("%d", &t);
while (t--) {
scanf ("%d", &n);
digit = 0;
for (i=1; i<=n; ++i) digit += log10(i);
printf ("%d\n", (int)digit+1);
}
return 0;
}


//超时
/*

#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;

int main() {
int t;
scanf ("%d", &t);
while (t--) {
int n;
scanf ("%d", &n);
double digit = 0;
for (int i=1; i<=n; ++i) digit += log10(i);
printf ("%d\n", (int)digit+1);
}
return 0;
}
*/


...

你可能感兴趣的:(HDU)