LightOJ1234调和级数求和公式

1234 - Harmonic Number
    PDF (English) Statistics Forum
Time Limit: 3 second(s) Memory Limit: 32 MB

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

Output for Sample Input

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

 


PROBLEM SETTER: JANE ALAM JAN

题意:
求n级调和级数之和:h[n] = 1/1 + 1/2 + 1/3 + 1/4 +…+ 1/n。(n <= 1e8)。要求误差不超过1e-8. 

网上的题解主要有两个思路,

思路1: 
由于 n 最大是 1e8的大小,显然打不了这么大的表.于是考虑每100个数记录一下.
于是对于在最后一个区域中时,然后询问时就是在这个基础上最多在查100个数.

代码
/**
    调和级数和打表,但是因为n是1e8次方,所以想到分区域打表.
    每100个打一个表,
    于是对于在最后一个区域中时,然后询问时就是在这个基础上最多在查100个数.
*/
#include
using namespace std;
const int maxn = 1e6+10;
double arr[maxn];
void init() {
    arr[0] = 0;
    double temp = 0;
    for(int i=1;i

思路2
利用公式


当n > 1e6时可以用公式:

调和级数求和的式子 趋近值为 :
   h[n]=(log(n * 1.0) + log(n + 1.0)/2.0 + 1.0/(6.0 * n * (n + 1)) - 1.0 / (30.0 * n * n * (n + 1) * (n + 1)) + r。
   其中r为欧拉常数:
   r=0.57721566490153286060651209008240243104215933593992.


我记得 一般为 h[n] = In(n+1) + r ,但是这里的精度不够.上面的好像更精确点,

据说是来自https://en.wikipedia.org/wiki/Euler%E2%80%93Mascheroni_constant

代码

#include
using namespace std;
const int maxn = 1e6+10;
const double r = 0.57721566490153286060651209008240243104215933593992;
double arr[maxn];
void init() {
    arr[0] = 0;
    double temp = 0;
    for(int i=1;i




你可能感兴趣的:(数论)