您的位置:首页 > 其它

hdu1018——Big Number

2016-01-13 09:25 267 查看

Big Number

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 32419 Accepted Submission(s): 15180



[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


前两天写了N!的共精度实现,于是这题仍然妄想会直接想过,暴力算出N!,然后输出位数然。

于是。。。超时!

#include<iostream>
#include<cstdio>
using namespace std;
long num[10000000];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a;
scanf("%d",&a);
long i,j,c,m=0;

num[0]=1;
for(i=1;i<=a;i++)
{
c=0;
for(j=0;j<=m;j++)
{
num[j]=num[j]*i+c;
c=num[j]/10;
num[j]%=10;
}
while(c)
{
num[++m]=c%10;
c/=10;
}
}
printf("%d\n",m+1);
}
return 0;
}
之后想到了找规律的方法,分别找到了a的取10的对数,a开平方的数都没发现规律。也根据位数直接做了一些判断,还是不行。

晚上睡觉前,看了别人的博客,发现要走的路还很长!

求一个数n的位数,直接求n以10为底的对数不就好了吗?然后由于是阶乘,直接用公式化简,空间复杂度o(n)



通过这道题,还学到了另一个重要的东西——斯特林公式


然后直接用求对数的方法来求这个解;空间复杂度o(1),有些东西简直不敢相信!

#include<iostream>
#include<cmath>
#define PI 3.1415926
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
double a,res;
cin>>a;
res=(0.5*log(2*PI*a)+a*log(a)-a)/log(10)+1;
cout<<(int)res<<endl;
}
return 0;
}


确实从开始的超时,到最后的o(1)让人难以置信,要走的路还很长!加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: