题意:求f(n)=1/1+1/2+1/3+1/4…1/n (1 ≤ n ≤ 108).,精确到10-8 (原题在文末)
知识点:n较小时直接求出 较大用公式
f(n)≈ln(n)+C+1/2*n
欧拉常数值:C≈0.57721566490153286060651209
c++ math库中,log即为ln。
题解如下:
#include <cmath>
#include <cstdio>
#include<iostream>
#define ll long long
using namespace std;
const int maxn=1e4;
double f[maxn+5];
int main()
{
int T;
scanf("%d",&T);
f[1]=1;
for(int i=2;i<=maxn;i++)
f[i]=f[i-1]+1.0/i;
for(int cas=1;cas<=T;cas++)
{
int n;
scanf("%d",&n);
if(n<=maxn)
printf("Case %d: %.10lf\n",cas,f[n]);
else
{
double ans=log(n)+0.57721566490153286060651209+1.0/(2*n);
printf("Case %d: %.10lf\n",cas,ans);
}
}
return 0;
}