Harmonic Number (II)

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

题解:

当 t = 1 时,有 10/1 - 10/2 == 5个;当 t = 2 时,有10/2 - 10/3 == 2个; 当 t = 3 时,

有10/3 - 10/4 == 1个;当 t= 10时,有10/10 - 10/11 == 1个,所以规律是

当t == i 的时候,个数就是 10/i - 10/(i+1)

代码如下

#include<stdio.h>
#include<math.h>
int main()
{
    int t,h=0;
    scanf("%d",&t);
    while(t--)
    {
        h++;
        long long n,i,ans=0;
        scanf("%lld",&n);
        for(i=1;i<=sqrt(n);i++)
        {
            ans=ans+n/i;
            if(n/i>n/(i+1))
            {
                ans=ans+(n/i-n/(i+1))*i;
            }
        }
        i--;
        if(n/i==i)
        {
            ans=ans-i;
        }
        printf("Case %d: %lld\n",h,ans);
    }
    return 0;
}
发布了30 篇原创文章 · 获赞 1 · 访问量 227

猜你喜欢

转载自blog.csdn.net/weixin_46204099/article/details/105300300
今日推荐