Harmonic Number LightOJ - 1234 (暴力打表,区域保存)

    xiaoxiao2021-03-25  132

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

    Hn = 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<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<queue> #include<algorithm> #define ll long long #define inf 0x3f3f3f3f #define maxn 1e8+7 using namespace std; double a[2000100]; void Init() { a[0] = 0.0; a[1] = 1.0; double ans = 1; for( int i = 2; i < maxn; i ++) { ans += 1.0 / i; if( i % 50 == 0) a[i/50] = ans; } } int main() { int t,n; Init(); // for(int i = 0;i <= 10; i++) // printf("%lf\n",a[i]); scanf("%d",&t); for(int i = 1; i <= t;i ++) { scanf("%d",&n); int tmp = n / 50; double ans = a[tmp]; for(int j = tmp * 50 + 1; j <= n; j ++) { ans += 1.0 / j; } printf("Case %d: %.9lf\n",i,ans); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-6336.html

    最新回复(0)