Big Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32172 Accepted Submission(s): 15038
Problem Description
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.
Input
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 ≤ 10
7 on each line.
Output
The output contains the number of digits in the factorial of the integers appearing in the input.
Sample Input
2 10 20
Sample Output
7 19
给出一个数,求这个数的阶乘有多少位..........
首先,大数处理比较复杂,很难实现,然后有个公式:斯特林公式,但是个人不会用...
后来见到学长用了取对数的方法,瞬间顿悟......
很久之前就做过了..........
但是现在却因为log 函数对参数的类型要求太严格,CE了........
看来以后还要注意参数的类型啊,编译器也是靠不住啊.........
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
double sum=1;
for(int i=1;i<=n;++i)
{
sum+=log10(i*1.0);
}
printf("%d\n",(int)sum);
}
return 0;
}
2016年2月2日21:59
大约学习了一下斯特林公式.....
加上对数的性质的运用...
#include<stdio.h>
#include<math.h>
double pi=acos(-1),e=2.718281828459;
//实在不知道怎么记住e了
int stl(int n)
{
double x=(double)n;
return (int)(log10(sqrt(2*pi*x))+x*log10(x/e)+1);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",stl(n));
}
return 0;
}
2016年3月18日
在poj 上做了一次,才发现原来自己以前的方法原来是有漏洞的........
对于1的情况,判断错误,后来发现竟然是因为(int)x+1 和 (int)(x+1) 的结果不一样。到底回事,我也不清楚.............
然后还有floor 函数的取整,也是有些微区别的......
好多函数啊,都搞混乱了..........
不过另有所获:
学会了使用一个函数 :exp(1.0) 用这个计算机e 的相关数据就比较方便了!
#include<stdio.h>
#include<math.h>
double e=exp(1.0),pi=acos(-1);
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double n;
scanf("%lf",&n);
n=log10(sqrt(2*pi*n))+n*log10(n/e);
printf("%d\n",(int)n+1);
}
return 0;
}