您的位置:首页 > 其它

Big Number

2015-08-06 09:35 513 查看

Big Number

[align=center]Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30956    Accepted Submission(s): 14351
[/align]

[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.

 

[align=left]Sample Input[/align]

2
10
20

 

[align=left]Sample Output[/align]

7
19

 

[align=left]Source[/align]

Asia 2002, Dhaka (Bengal)

 题意:求n的阶乘的位数

应用知识:斯特林公式:n!=sqrt(2*PI*n)*(n/e)^n;(PI=3.1415.......,e=2.71828....)

                  n!的位数等于(int)log10(n!)+1;

易错点: 大的数在进行乘法运算时耗时故计算时采用log10n!)=log10(1)+log10(2)+..........lon10(n)
<pre name="code" class="csharp"><pre name="code" class="plain"><span style="font-size:14px;">#include<stdio.h>
#include<math.h>
//#define PI 3.1416926
//#define e 2.71828
int main(){
int n;
scanf("%d",&n);
while(n--){
int m,i;
double k=0;
scanf("%d",&m);
//k=m*log10(m/e)+log10(2*PI*m);//大数相乘计算耗时并且存在误差由于PI e所致
//d=(int)k;
for(i=1;i<=m;i++)
k=k+log10(i);//log10i这样写是错误的
printf("%d\n",(int)k+1);
}
return 0;
}</span>





 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdoj