• LightOJ 1245 Harmonic Number (II)(找规律)


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

    G - Harmonic Number (II)
    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

    Description

    I was trying to solve problem '1234 - Harmonic Number', I wrote the following code

    long long H( int n ) {
        long long res = 0;
        for( int i = 1; i <= n; i++ )
            res = res + n / i;
        return res;
    }

    Yes, my error was that I was using the integer divisions only. However, you are given n, you have to find H(n) as in my code.

    Input

    Input starts with an integer T (≤ 1000), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n < 231).

    Output

    For each case, print the case number and H(n) calculated by the code.

    Sample Input

    11

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    2147483647

    Sample Output

    Case 1: 1

    Case 2: 3

    Case 3: 5

    Case 4: 8

    Case 5: 10

    Case 6: 14

    Case 7: 16

    Case 8: 20

    Case 9: 23

    Case 10: 27

    Case 11: 46475828386

    根据题中的代码便可知道题意,题意不多说
     
    先看两个例子
    1.
    n = 10    sqrt(10) = 3     10/sqrt(10) = 3
    i        1   2   3         4   5   6   7   8   9   10
    n/i    10  5   3         2   2   1   1   1   1    1
     
    m =  n/i
    sum += m;
    m = 1的个数10/1-10/2 = 5;
    m = 2的个数10/2-10/3 = 2;
    m = 3的个数10/3-10/4 = 1;
     
    2.
    n = 20     sqrt(20) = 4     20/sqrt(20) = 5
    i        1   2   3   4       5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20
    n/i    20  10 6   5       4   3   2   2   2    2     1     1     1     1     1     1     1     1    1    1
     
    m =  n/i
    sum += m;
    m = 1的个数20/1-20/2 = 10;
    m = 2的个数20/2-20/3 = 4;
    m = 3的个数20/3-20/4 = 1;
    m = 4的个数20/4-20/5 = 1;
    ...
    m = i的个数20/i - 20/(i + 1)(1<= i <= sqrt(n))
     
    这样我们可以得出:sqrt(n)之前的数我们可以直接用for循环来求
    sqrt(n)之后的sum += (n/i - n/(i + 1)) * i;
    当sqrt(n) = n / sqrt(n)时(如第一个例子10,sum就多加了一个3),sum多加了一个sqrt(n),减去即可;
     
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    const int N = 10010;
    typedef long long ll;
    
    int main()
    {
        int t, n, p = 0;
        ll sum;
        scanf("%d", &t);
        while(t--)
        {
            sum = 0;
            p++;
            scanf("%d", &n);
            int m = sqrt(n);
            for(int i = 1 ; i <= m ; i++)
                sum += n / i;
            for(int i = 1 ; i <= m; i++)
                 sum += (n / i - n / (i + 1)) * i;
            if(m == n / m)
                sum -= m;
            printf("Case %d: %lld
    ", p, sum);
        }
        return 0;
    }
     
  • 相关阅读:
    数据库学习之范式理解
    Java学习之网络编程
    Hadoop学习之HBase和Hive的区别
    erlang 查看进程相关信息
    erlang web socket参考。
    erlang启动参数
    调试信息和错误信息。
    进程监控树。
    erlang的进程池。
    日志系统。
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4936325.html
Copyright © 2020-2023  润新知