Harmonic number

Description
In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:

h[n] = 1 + 1/2 + 1/3 + ……+1/n;

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
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double r=0.57721566490153286060651209;     //欧拉常数
double a[10000];

int main()
{
    a[1]=1;
    for (int i=2;i<10000;i++)
    {
        a[i]=a[i-1]+1.0/i;
    }
    int n;
    cin>>n;
    for (int kase=1;kase<=n;kase++)
    {
        int n;
        cin>>n;
        if (n<10000)
        {
            printf("Case %d: %.10lf\n",kase,a[n]);
        }
        else
        {
            double a=log(n)+r+1.0/(2*n);
            ///double a=log(n+1)+r;
            printf("Case %d: %.10lf\n",kase,a);
        }
    }
    return 0;
}

前面10000个可以正常打表,后面的我们就用公式,再说了,这个公式能成立,本来就是在n比较大的时候,公式如下:  r为常数,r=0.57721566490153286060651209(r就是欧拉常数)。

特别注意,由于题目要求精度为10^-8,常数r也是前人推导出来的,然而也只推导了有限位数,所以正常利用这个公式,并不能达到精度要求,我们只好比较样例和我们自己输出的数据,增添一些可行的项,经尝试,在原公式的基础上,再减去一个1.0/(2*n)恰好可以满足精度

 

posted @ 2016-08-04 16:43  biu~biu~biu~  阅读(224)  评论(0编辑  收藏  举报