• 1245


    1245 - Harmonic Number (II)
    Time Limit: 3 second(s) Memory Limit: 32 MB

    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

    Output for Sample Input

    11

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    2147483647

    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),减去即可;
    无语,这里输出%I64d竟然wa。。。
    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define mem(x,y) memset(x,y,sizeof(x))
     7 using namespace std;
     8 typedef long long LL;
     9 const int INF=0x3f3f3f3f;
    10 
    11 int main(){
    12     int T;
    13     int n,cnt=0;
    14     LL res;
    15     scanf("%d",&T);
    16     while(T--){
    17         res=0;
    18         scanf("%d",&n);
    19         int m=sqrt(n);
    20         for(int i=1;i<=m;i++)res+=n/i;
    21         for(int i=1;i<=m;i++)
    22             res+=(n/i-n/(i+1))*i;
    23             if(m==n/m)res-=m;
    24         printf("Case %d: %lld
    ",++cnt,res);
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    [文档].艾米电子 移位寄存器,Verilog
    [书籍].Pong P. Chu FPGA Prototyping By Verilog Examples
    [转载].FPGA三国志
    [笔记].电机行业常用的中英文对照
    [原创][连载].基于SOPC的简易数码相框 – Nios II SBTE部分(软件部分) 配置工作
    [转载].振南带你入门FAT32文件系统 视频
    [文档].艾米电子 在综合中使用函数,Verilog
    [转载].阿迪老师 《SD卡入门到精通》视频
    [文档].艾米电子 寄存器,Verilog
    [笔记].怎样消除pointer targets in passing argument n of 'func_xxx' differ in signedness警告
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4946231.html
Copyright © 2020-2023  润新知