poj 1423 Big Number

缘起

给定正整数n, 求 n! 的位数

分析

题意很裸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在许多应用中,需要非常大的整数。 其中一些应用程序使用密钥进行数据的安全传输,加密等。在这个问题中给出一
个数字,你必须确定数字的阶乘数字。

【输入】
输入由几行整数组成。 第一行包含一个整数n,它是要测试的样例数,后跟n行,每行一个整数1<= m<= 10^7

【输出】
输出包含输入中出现的整数的阶乘的位数。

【样例输入】
2
10
20

【样例输出】
7
19

【限制】
Time limit 1000 ms
Memory limit 65536 kB

直接给公式

1
long result = (long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(n)­log10(exp(1.0))))+1);

ac代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"

#include <stdio.h>
#include <math.h>
#define LOCAL
typedef long long LL;

LL xx(LL n) {return n==1?1:(long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(1.0*n)-log10(exp(1.0))))+1);}

int main()
{
#ifdef LOCAL
freopen("d:\\data.in", "r", stdin);
#endif
LL t,n, ret;
scanf("%lld", &t);
while(t--)
{
scanf("%lld", &n);
printf("%lld\n", xx(n));
}
return 0;
}

ac结果如下

20678552 yfsyfs 1423 Accepted 356K 0MS GCC 385B 2019-08-07 15:52:42