就是这个东西,高数课上学过,然后要开洞脑筋在计算机上算这个东西
如果n比较大,打表会MLE,可以打跳表,也就是每40个数记录一次结果
如果n小的时候直接求就可以了
n大的时候有近似公式
f(n)≈ln(n)+C+1/2*n 欧拉常数值:C≈0.57721566490153286060651209
下面给出实现:LightOJ1234
1 #include<cstdio> 2 #include<cmath> 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 ",cnt,a[n]); 20 else 21 { 22 double x=log(n)+r+1.0/(2*n); 23 printf("Case %d: %.10lf ",cnt,x); 24 } 25 } 26 return 0; 27 }