题干:
多组输入,给你一个n,求出H(n) = 1 + 1 2 \frac{1}{2} 21 + 1 3 \frac{1}{3} 31 + … + 1 n \frac{1}{n} n1 = ∑ 1 n \sum \frac{1}{n} ∑n1 ,保留八位小数。
思路:
(1)观察公式,可以发现这是一个调和级数求前n项和,因为只保留八位小数,我们可以使用调和级数的近似公式() H(n) =
l
n
(
n
)
ln(n)
ln(n) +
1
2
∗
n
\frac{1}{2*n}
2∗n1 + c (c为欧拉常数c=0.57721566490153286060651209)
但这个公式只能在n较大的时候使用,否则会有较明显误差,所以我们对小于1000000的n直接暴力求。
#include <cstdio>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#define LL long long
using namespace std;
const LL mod = 1e9+7;
const double ol=0.57721566490153286060651209; //欧拉常数
double shu[1000000];
int main()
{
LL x;
int t;
shu[1]=1;
for(int i=2;i<1000000;i++)
shu[i]=shu[i-1]+1.0/i;
scanf("%d",&t);
for(int j=1;j<=t;j++){
scanf("%lld",&x);
if(x<1000000)
printf("Case %d: %.10lf\n",j,shu[x]);
else
{
double ans=log(x)+ol+1.0/(2*x);
printf("Case %d: %.10lf\n",j,ans);
}
}
return 0;
}
(2)