zoukankan      html  css  js  c++  java
  • LightOJ 1234 Harmonic Number(打表 + 技巧)

    http://lightoj.com/volume_showproblem.php?problem=1234

    Harmonic Number
    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

    Description

    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

    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

    题目大意:

    求1 + 1/2 + 1/3 + 1/4 + 1/ 5 +...+ 1/ n(1 ≤ n ≤ 108)

    调和级数部分和,可以利用公式,(唉,然而我并不记得公式高数没学好-_-||)

    如果直接循环的肯定会超时,那么我们开一个10^8/40 = 250万的数组用来分别存

    1到1/40的和、1到1/80的和、1到1/120的和、1到1/160的和、... 、1到1/2500000的和

    这样对于每一个n最多循环39次,节省了时间

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    const int N = 2500010;
    const int M = 1e8 + 10;
    typedef long long ll;
    
    double a[N];
    
    int main()
    {
        int t, n, p = 0;
        double s = 0;
        for(int i = 1 ; i < M ; i++)
        {
            s += (1.0 / i);
            if(i % 40 == 0)
                a[i / 40] = s;
        }
        scanf("%d", &t);
        while(t--)
        {
            p++;
            scanf("%d", &n);
            int x = n / 40;
            s = a[x];
            for(int i = x * 40 + 1 ; i <= n ; i++)
                s += (1.0 / i);
            printf("Case %d: %.10f
    ", p, s);
        }
        return 0;
    }
  • 相关阅读:
    POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci
    [codeforces 508E]Maximum Matching
    [SDOI2011]染色
    [CSU1806]Toll
    [HDU4969]Just a Joke
    [HDU1071]The area
    [HDU1724]Ellipse
    [VIJOS1889]天真的因数分解
    [BZOJ3379] Turning in Homework
    [BZOJ1572] WorkScheduling
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4939458.html
Copyright © 2011-2022 走看看