标签:mathematics
题意:给你一个数,计算他的阶乘有多少位。
算阶乘再看位数必超时。1<=n<=1e7。
想每次%10 。一开始用int 果然有精度问题。于是double水了。600+ms
后来想到可以 log 10 () 。于是900+ms。
总觉得不对。应该有公式。看discuss 后终于知道了。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define PI 3.141592654 #define LL long long #define debug puts("==fuck==") #define acfun std::ios::sync_with_stdio(false) using namespace std; //int main() //{ // int m; // scanf("%d",&m); // while(m--) // { // int n; // scanf("%d",&n); // int s=1; // double c=1; // for(int i=2;i<=n;i++) // { // c*=i; // while(c>=10) // { // c/=10; // s++; // } // } // printf("%d\n",s); // } //} //687MS //int main() //{ // int m; // double s; // scanf("%d",&m); // while(m--) // { // int n; // scanf("%d",&n); // s=1.0; // for(int i=1;i<=n;i++) // s+=log10(i); // printf("%d\n",(int)s); // } // return 0; //} //968MS #define E 2.71828182845904523536028747135266250 int main() { int m; scanf("%d",&m); while(m--) { int n; scanf("%d",&n); double s=log10(sqrt(2*PI*n))+n*log10(n/E); printf("%d\n",(int)s+1); } } //0ms
标签:mathematics
原文地址:http://blog.csdn.net/dongshimou/article/details/39153507