看了些题解,有两种方法,一个公式,很显然我记不住所以略过;
第二种打表。但是很显然1e8的表打不完,所以这里采取一种技巧,牺牲一定的时间换取一些空间:每一百个数进行一次记录,这样剩下没求的再循环求得即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
double db[maxn];
int tot=0;
void init()
{
double temp=0.0;
for(int i=1;i<=(int)1e8+100;i+=100){
for(int j=i;j<=i+99;j++){
temp+=1.0/(double)j;
}
db[++tot]=temp;
}
}
int main()
{
init();
int t;cin>>t;
for(int j=1;j<=t;j++){
int n;cin>>n;
if(n%100==0){
printf("Case %d: %.9lf\n",j,db[n/100]);
continue;
}
double ans=db[n/100];
for(int i=n/100*100+1;i<=n/100*100+n%100;i++){
ans+=1.0/(double)i;
}
printf("Case %d: %.9lf\n",j,ans);
}
}