码迷,mamicode.com
首页 > 其他好文 > 详细

[51nod1058]求N!的长度

时间:2017-05-27 10:38:14      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:bsp   log   app   误差   复杂度   cout   nbsp   turn   i++   

法1:stirling公式近似

$n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$

(如果怕n不够大下式不成立,可以当数小于10000时用for求阶层)

也可以用log10函数,不过直接使用log,e没有误差,一定注意longlong;

复杂度$O(1)$

 1 #include<bits/stdc++.h>
 2 #define PI  acos(-1.0)
 3 using namespace std;
 4 typedef long long ll;
 5 int main(){
 6     int n,t;
 7     cin>>t;
 8     double ans;
 9     while(t--){
10         cin>>n;
11         ans=(0.5*log(2*PI*n)+n*log(n)-n)/log(10);
12         cout<<(ll)ans+1<<endl;
13     }
14     return 0;
15 }

法二:

直接for+log10循环求,复杂度$O(n)$

 1 #include<bits/stdc++.h>
 2 #define PI  acos(-1.0)
 3 using namespace std;
 4 typedef long long ll;
 5 int main(){
 6     int n;
 7     cin>>n;
 8     double ans=1.0;//对10取对数之后需要+1 
 9     for(int i=1;i<=n;i++){
10         ans+=log10(i);
11     }
12     cout<<(int)ans<<endl;
13     return 0;
14 }

 

[51nod1058]求N!的长度

标签:bsp   log   app   误差   复杂度   cout   nbsp   turn   i++   

原文地址:http://www.cnblogs.com/elpsycongroo/p/6911119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!