您的位置:首页 > 其它

hdu 1018 Big Number

2016-04-07 00:14 417 查看
[align=left]Problem Description[/align]
In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of
digits in the factorial of the number.
 
[align=left]Input[/align]
Input consists of several lines of integer numbers. The first line contains an integer n, which is the number of cases to be tested, followed by n lines, one integer 1 ≤ n ≤ 107 on each line.
 
[align=left]Output[/align]
The output contains the number of digits in the factorial of the integers appearing in the input.
 
Sample Input
2 10 20
 
[align=left]Sample Output[/align]
7 19
 
题目的意思是给出一个数,让你求这个数阶乘的位数。

网上的大神给出的方法是,将n!表示成10的次幂,即n!=10^M(10的M次方,10^2是3位M+1就代表位数)则不小于M的最小整数就是     n!的位数,对该式两边取对数,有M=log10^n!即:     M = log10^1+log10^2+log10^3...+log10^n     循环求和,就能算得M值,该M是n!的精确位数。

 

#include <cstdio>
#include <cmath>
int main()
{
int i, t, n;
double sum;
scanf("%d", &t);
while (t--)
{
sum = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
sum += log10(i);
printf("%d/n", (int)sum);
}
return 0;
}

当数比较大的时候,可以利用斯特林公式:

#include
#include
const double PI = 3.141592653589;
int main() {
int n, t;
double sum;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
if (n == 0 || n == 1) { printf("1n"); continue; }
sum = (n*log(n) - n + 0.5*log(2 * PI*n)) / log(10) + 1;
printf("%dn", (int)sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: