了解了分块打表的思想:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define ll long long
const int maxn=2e6+10;
const int maxx=1e8;
double a[maxn]={0};
int main()
{
memset(a,0,sizeof a);
double sum=0;
int c=1;
for(int i=1;i<=maxx;i++)
{
sum+=1.0/i;
if(i%50==0)
{
a[c++]=sum;
}
}
int t;
scanf("%d",&t);
int flag=1;
while(t--)
{
int n;
scanf("%d",&n);
int d=n/50;
double r=a[d];
for(int i=d*50+1;i<=n;i++)
{
r+=1.0/(double)i;
}
printf("Case %d: %.10lf\n",flag++,r);
}
}