首页 > 代码库 > HDU 1018 Big Number
HDU 1018 Big Number
题意:给你一个数,计算他的阶乘有多少位。
算阶乘再看位数必超时。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
HDU 1018 Big Number
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。