C - Harmonic Number(调和级数+欧拉常数)
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 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 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 else 26 { 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 }