首先题目要求保留小数点后5位,那么当n大到一定程度,前5位是不会再改变了。对于会变的情况直接打表预处理,大于则直接输出不变的结果。题目很坑,没说n的范围,需要用字符串读入。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
const int maxn=1000010;
const int c=130000;
char s[maxn];
double f[c];
void init()
{
f[1]=1.0;
for(int i=2;i<c;i++)
{
f[i]=f[i-1]+1.0/(i*1.0)/(i*1.0);
}
}
int main()
{
init();
int res;
while(~scanf("%s",&s))
{
int len=strlen(s);
if(len>6) printf("%.5f\n",f[c-1]);
else
{
res=0;
for(int i=0;i<len;i++)
{
res=res*10+s[i]-'0';
}
if(res>c) printf("%.5f\n",f[c-1]);
else printf("%.5f\n",f[res]);
}
}
return 0;
}