就是这个东西,高数课上学过,然后要开洞脑筋在计算机上算这个东西
如果n比较大,打表会MLE,可以打跳表,也就是每40个数记录一次结果
如果n小的时候直接求就可以了
n大的时候有近似公式
f(n)≈ln(n)+C+1/2*n 欧拉常数值:C≈0.57721566490153286060651209
下面给出实现:LightOJ1234
1 #include2 #include 3 const double r=0.57721566490153286060651209; 4 int n; 5 double a[100005]; 6 int main() 7 { 8 a[1]=1; 9 for(int i=2;i<10000;i++)10 a[i]=a[i-1]+1.0/i;11 int T;12 scanf("%d",&T);13 int cnt=0;14 while(T--)15 {16 scanf("%d",&n);17 cnt++;18 if(n<10000)19 printf("Case %d: %.10lf\n",cnt,a[n]);20 else21 {22 double x=log(n)+r+1.0/(2*n);23 printf("Case %d: %.10lf\n",cnt,x);24 }25 }26 return 0;27 }