我们知道整数n的位数的计算方法为:log10(n)+1
n!=10^m
故n!的位数为 m = log10(n!)+1

lgN!=lg1+lg2+lg3+lg4+lg5+....................+lgN;

但是当N很大的时候,我们可以通过数学公式进行优化:(即Stirling公式)

N!=sqrt(2*pi*N)*(N/e)^N;(pi=3.1415926=acos(-1.0),e=exp(1))

lgN!=(lg(2*pi)+lgN)/2+N*(lgN-lge);

斯特林公式可以用来估算某数的大小结合lg可以估算某数的位数,或者可以估算某数的阶乘是另一个数的倍数。

例题

https://www.nowcoder.net/acm/contest/75/A

题意 求解n的阶乘八进制下的位数

n!=8^res     n!=e^m

res=log8(n!)   m=loge(n!)

log8(n!)= loge(n!)/loge(8)  res = m/loge(8)换底公式

m=loge(2*pi*n)/2+n*loge(n/e)

AC代码

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <vector>
using namespace std;
const int maxn = 1e6+;
const int inf = 0x3f3f3f3f;
const double e = exp();
const double pi = acos(-1.0);
const double epx = 1e-;
typedef long long ll;
int main()
{
ll t;
scanf("%lld",&t);
while(t--){
ll n;
scanf("%lld",&n);
if(n==||n==){
puts("");
continue;
}
double res = (log(*pi*n)/2.0+n*log(n/e))/log()+;
printf("%lld\n",(ll)res);
}
return ;
}

最新文章

  1. jquery源码中的(function(window, undefined){})(window)【转】
  2. The Towers of Hanoi Revisited---(多柱汉诺塔)
  3. OOP多态和继承要点
  4. Android --资料集合
  5. MySql经典语句
  6. strtol()函数
  7. 禁止Android的StatusBar下拉
  8. Saruman&#39;s Army (POJ 3069)
  9. iOS GCD详解
  10. WPF学习(2)XAML
  11. BZOJ 3990: [SDOI2015]排序 [搜索]
  12. rsync + sersync 实现实时数据同步
  13. ImageMagick - 设置透明带 AlphaChannel 的 png 图片的透明度
  14. 快速傅里叶变换(FFT)_转载
  15. frei0r-1.6.1 for win32 133 DLLs
  16. logstash 使用kafka范例
  17. Async 详解
  18. 泡泡一分钟:A Multi-Position Joint Particle Filtering Method for Vehicle Localization in Urban Area
  19. tp剩余未验证内容-3
  20. ural1517

热门文章

  1. mysql 忘记密码 登陆+修改密码
  2. php接收json格式数据(text/xml)
  3. 解决QTreeView不能设置列宽的问题
  4. Node.js+Express+MVC+Mysql小白创建新项目
  5. 强大的云存储与应用管理工具DzzOffice1.0 Beta(大桌子办公)发布下载
  6. 使用JQuery MiniUI,json数据构建TreeGrid(树图)
  7. git 提交运用vim编辑器
  8. QT5:先导篇 算法
  9. SQLServer:查询所有外键关联表信息
  10. Maven 的相关配置