I - Harmonic Number
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 |
题目所给为调和级数,欧拉给出过一个近似公式:(n很大时)
f(n)≈ln(n)+C+1/2*n
欧拉常数值:C≈0.57721566490153286060651209
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6+7;
double C = 0.57721566490153286060651209;//欧拉常数
double m[maxn];
void init()
{
m[0] = 0;
m[1] = 1.0;
for(int i = 2; i < maxn; i++)
m[i] = m[i - 1]+ 1/(1.0*i);
}
int main()
{
int t, n, cas = 0;
scanf("%d",&t);
double a;
init();
while(t--)
{
scanf("%d",&n);
if(n<maxn) a = m[n];
else a = log(n) + C + 1.0/(2 * n);//公式
printf("Case %d: %.10lf\n", ++cas, a);
}
return 0;
}