In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:
In this problem, you are given n, you have to find Hn.
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case starts with a line containing an integer n (1 ≤ n ≤ 108).
For each case, print the case number and the nth harmonic number. Errors less than 10-8 will be ignored.
12
1
2
3
4
5
6
7
8
9
90000000
99999999
100000000
Case 1: 1
Case 2: 1.5
Case 3: 1.8333333333
Case 4: 2.0833333333
Case 5: 2.2833333333
Case 6: 2.450
Case 7: 2.5928571429
Case 8: 2.7178571429
Case 9: 2.8289682540
Case 10: 18.8925358988
Case 11: 18.9978964039
Case 12: 18.9978964139
题意:
给定n,求调和级数Hn;
注意:
输出五花八门,关键是保留十位小数,直接输出%.10f就行
n<=1e8,直接开数组打表会ML,这时候要用欧拉公式,但是n很大时公式才成立,所以一部分打表,另一部分直接算,数组开到1e4就行。
Hn=ln(n)+c+1.0/(2*n)
c=0.57721566490153286060651209;
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>;
using namespace std;
const double c=0.57721566490153286060651209;
double ans[10000];
void mul()
{
memset(ans,0,sizeof(ans));
for(int i=1;i<10000;i++)
ans[i]=ans[i-1]+1.0/i;
}
int main()
{
int t,n;
mul();
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&n);
if(n<10000)
printf("Case %d: %.10f\n",i,ans[n]);
else
printf("Case %d: %.10f\n",i,log(n)+c+1.0/(2*n));
}
return 0;
}