这道题···吃了没学过调和级数求和的大亏。
具体来说是有一个公式:也就是ans=log(x)+r+1.0/(x*2);
这里的r指的是欧拉常数,算出来的
r=0.5772156649015328606060651209;
但是这个算法是有误差的x离1越远误差越小,所以我们要先暴利出前半段的部分,后面误差小的时候再用公式求
代码如下
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define fin(a,n) for(int i=a;i<=n;i++)
const int maxn=1e4+10;
double f[maxn];
double y=0.5772156649015328606060651209;
void init()
{
f[1]=1;
fin(2,maxn)
{
f[i]=f[i-1]+(double)1/i;
}
}
int main()
{ init();
int n;
scanf("%d",&n);
for(int cas=1;cas<=n;cas++)
{
ll x;
scanf("%lld",&x);
if(x<=maxn)printf("Case %d: %.10lf\n",cas,f[x]);
else
{
printf("Case %d: %.10lf\n",cas,log(x)+y+1.0/(2*x));
}
}
}