首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

N!的最高位,该怎么处理

2012-02-23 
N!的最高位这里给出我的代码:#include iostream#include cmathusing namespace stdint firstDigit(in

N!的最高位
这里给出我的代码:
#include <iostream>
#include <cmath>
using namespace std;

int firstDigit(int n)
{
int k=0; //位数  
double t=0; //lg(n!)
for(int i=2;i<=n;i++)
{
t+=log10(i);
}
k=(int)t+1;
return (int)(pow(10,t-k+1)+1e-10)%10;
}

int main()
{
int n;
while(cin>>n) {
cout<<firstDigit(n)<<endl;
}
return 0;
}

这里n最大为10000000

哪位大大有更快的算法?


[解决办法]
可以用斯特林近似来求,或先求log的加和,再返回估算结果。

http://blog.csdn.net/liangbch/archive/2007/04/13/1563395.aspx
[解决办法]
已经是非常好的了吧,确定是足够的精确的话,就是很正确的啦。
还要快的话,大概就是一些对求log的优化吧
[解决办法]
数学归纳法。
[解决办法]
log和pow都很费时,这样可以不?

C/C++ code
int Factorial(long n){    long long s = 1 ;    for (int i = 2; i <= n; i++)    {        s *= i ;        while (s > 100000000)        {            s /= 10 ;        }    }    while (s >= 10)    {        s /= 10 ;    }    return s ;}
[解决办法]
楼上这样求结果不对啊 
while (s > 100000000)
{
s /= 10 ;
}
这样除不行
[解决办法]
MARK...
[解决办法]
探讨
楼上这样求结果不对啊
while (s > 100000000)
{
s /= 10 ;
}
这样除不行

[解决办法]
exp{ 1/2*(log(2*PI)+log(N)) + N*log(N) - N + 1/(12*N) - 1/(360*N*N*N) } 是 N! 的一个良好近似值, 在N>=30后有10位以上的精度, N越大精度越好, N比较小的时候查表即可...



热点排行