Big Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17850 Accepted Submission(s): 8006
2 10 20
7 19刚开始我的思路是用大数来做。。代码如下。(超时代码)#include<stdio.h> #include<string.h> #define max 10000 int a[max]={0}; int main() { int n,i,j,t; scanf("%d",&t); while(t--) { scanf ( "%d" , &n) ; memset(a,0,sizeof(a)); a[0] = 1; for ( i=2 ; i<=n; i++) { int c=0; for ( j=0; j<max; j++) { int s=a[j]*i+c; a[j]=s%10; c=s/10; } }
for ( j=max-1; j>=0; j--) if (a[j]) break; printf("%d\n",j+1);
} return 0; }
后来看了一位大牛的博客才知道这题是不要用大数的,而且方法也极其简单思路: 求一个数有N多少位,可用log10(N)+1,于是,求N!就是求log10(1*2*3*……*n)=log10(1)+log10(2)+……+log10(N)+1代码如下(已AC)#include<iostream> #include<cmath>
using namespace std;
int main() { int n,i,t; double d; cin >> t; for(int a = 0; a < t; a++) { cin >> n; d = 0; for(i = 1; i <= n; i++) d += log10((double)i); cout << (int)d+1 << endl; }
return 0; }