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
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).
Output
For each case, print the case number and the nth harmonic number. Errors less than 10-8 will be ignored.
Sample Input
12
1
2
3
4
5
6
7
8
9
90000000
99999999
100000000
Sample Output
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
坑点:
1.输出第一个样例时可以是1.0000000000
2.对于double类型的数据进行除法时要采用1.0/i的形式,否则结果会有误差
题解:
调和级数公式:f(n) = ln(n) + C + 1.0/2*n;
其中C是欧拉常数其值等于C ≈ 0.57721566490153286060651209;
对于较小的数据公式的误差会比较大,所以对于前10000个数据采用打表的方法来求解
AC代码
1 #include2 #include 3 #include 4 const double C = 0.57721566490153286060651209; //欧拉常数 5 6 using namespace std; 7 8 int main() 9 {10 double a[10005];11 int t, n;12 int flag = 0;13 scanf("%d", &t);14 a[0] = 0;15 for(int i = 1; i <= 10000; i++)16 {17 a[i] = a[i-1] + 1.0/i;18 }19 20 while(t--)21 {22 scanf("%d", &n);23 if(n <= 10000)24 printf("Case %d: %.10lf\n", ++flag, a[n]);25 else26 {27 double sum;28 sum = log(n) + C + 1.0/(2*n); //这里是1.0不然的话算的结果有偏差29 printf("Case %d: %.10lf\n", ++flag, sum);30 }31 32 }33 34 return 0;35 }