题意:如题目.

方法一:<TLE>
* 可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对
* 该式两边取对数,有 M =log10^n! 即:M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,
* 该M是n!的精确位数。当n比较大的时候,这种方法方法需要花费很多的时间。
*
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main ()
{
int n;
double sum;
while(scanf("%d",&n)!=EOF)
{
sum=1;
for(int i=2;i<=n;i++)
sum+=log10(i);
printf("%d\n",(int)sum);
}
return 0;
}
*    方法二:
* 利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
* res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
* 当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<string>

#include<algorithm>

#include<cmath>

#include<vector>

#include<stack>

#include<map>

#include<queue>

#include<iostream>

using namespace std;

typedef long long ll;

int main ()

{

ll n;

double ans;

while(~scanf("%lld",&n))

{

ans=1;

if(n!=1&&n!=0)

ans=double( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0))))+1);

// ans=floor ((log(sqrt(2*n*pi))+n*log((double)n)-n)/log(10.0))+1;

printf("%lld\n",(ll)ans);

}

return 0;

}

//exp(x) #include<cmath>:求e^x.

最新文章

  1. Greenplum 源码安装教程 —— 以 CentOS 平台为例
  2. Intern---Microsoft Academic China Team
  3. iOS 为什么app都是异步编程
  4. Visual Studio安装及单元测试
  5. 超链接标签a样式生效,取消下划线,文字垂直(上下)居中
  6. 时钟 IoTimer
  7. IIS发布,图片和样式显示不了的问题
  8. React状态的含义和用法
  9. linux的NetworkManager服务(转)
  10. 查找最小的k个元素
  11. android基础-界面开发注意事项
  12. Multi-Projector Based Display Code ------- Home
  13. Flex读取txt文件里的内容(一)
  14. 虚拟机静态ip设置
  15. MATLAB 的unique函数——数组矩阵的唯一值
  16. 第三篇 makefile的伪目标
  17. MVC3控制器方法获取Form数据方法
  18. Office365创建通讯组
  19. Spring Cloud重试机制与各组件的重试总结
  20. poj 3225 Help with Intervals(线段树,区间更新)

热门文章

  1. PHP常用函数之数组篇
  2. .net core 系列
  3. DLL and LIB
  4. Chapter 1 Mr.Sherlock Holmes
  5. html+javascript实现可拖动可提交的弹出层对话框效果
  6. Balancing Symbols
  7. Django:之ORM、CMS和二维码生成
  8. httpclient调用方法
  9. octet-stream
  10. ubuntu 上下载PHP的源代码