时间怎样才可以变的更短???ACM高手帮帮忙?
我写了个程序 但是他的运行时间是1015 ms 但是我要的是他的时间小于 1000 我该怎么改呢??那个高手帮帮忙??
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream>
using namespace std;
int main()
{
int a,b,i,j,c,k,ren ,len ;
int p[100000];
cin > > a;
for( i = 0 ; i < a ; i++)
{
cin > > b;
p[0] = 1;
len = 1;
ren = 0;
c = 0;
for( j = 1 ; j <= b; j++)
{
for( k = 0 ; k < len ; k++)
{
c= p[k] * j + ren ;
p[k] = c % 10;
ren = c / 10;
}
while(ren > 0)
{
p[len] = ren %10;
len ++;
ren = ren / 10;
}
}
cout < < len < < endl;
}
return 0;
}
[解决办法]
log(2*pi*n*(n/e)^n)就是n!的位数!!!!!!呵呵
[解决办法]
n!有一个近似估计式:sqrt(2*pi*n)*[(n/e)^n]*[1+1/(12n)] (1)
其中:sqrt()是平方根函数;pi就是圆周率;e就是自然底数。
于是n!的位数可以对式(1)取以10为底的对数来近似。
对式(1)取以10为底的对数,
得到:log10( sqrt(2*pi*n)*[(n/e)^n]*[1+1/(12n)] ) [log10():以10为底的对数]
化简,得到:0.5*log10(2*pi*n)+n*log10(n/e)+log10(1+1/(12n)) (2)
因此,n!的位数可以由式(2)来近似了,而式(2)是易于计算的。