LightOJ Harmonic Number 1234【技巧】

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:

LightOJ Harmonic Number 1234【技巧】_第1张图片

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

 


解题思路:

该题可以利用公式。不过我不知道。。。。

普通的直接求会超时的。在网上看见其他人是每隔几位记录了值这样就快很多

此题完全忽视结果,记得保留10位小数即可。

AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

double a[2500010];
void init()
{
	double s=0;
	for(int i=1;i<100000010;i++){
		s+=(1.0/i);
		if(i%40==0) a[i/40]=s;
	}
}

int main()
{
	init();
	int t;
	scanf("%d",&t);
	int xp=1;
	while(t--){
		double n;
		scanf("%lf",&n);
		double ans=1.0;
		int x=n/40;
		ans=a[x];
		for(int i=40*x+1;i<=n;i++){
			ans+=(1.0/i);
		}
		printf("Case %d: %.10lf\n",xp++,ans);
	}
}



你可能感兴趣的:(LightOJ Harmonic Number 1234【技巧】)