Harmonic Number (II) (调和级数) LightOJ - 1245

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 < 2的31次方).

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

 

 

 题意:给出一个n,求出f(n)=n/1+n/2+n/3+n/4+...+n/n;

题解:先求出前sqrt(n)项的和,再求后面的。具体操作根据例题来了解。
例如:
               10 10/2 10/3 10/4 ... 10/10;
                先求出前 sqrt(n)项和 
                第二项与第一项的差是后面所有等于一的个数
                第三项与第二项的差是后面所有近似于等于二的个数
                当n/i==i时,n/i 计算了两边,所以需要减去  i

方法2:利用对称性。

              对于函数y=1/x,它关于y=x对称。

               所以求f(n)的时候,可以先求前sqrt(n)项的和,然后乘以2。

               注意:在sqrt(n)这个点,前面已经计算过了,结果乘以2的时候又计算了一次。

                           所以求最后结果的时候需要减去一次。

其实两种方法是一样的,只是后一种比较好理解。*-**-*


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
long long H(int n)
{
    int i;
    long long res=0;
    for(i=1; i<=(int)sqrt(n); i++)
    {
        res+=n/i;
        if(n/i>n/(i+1))
            res+=(long long)((n/i-n/(i+1))*i);
    }
    i--;
    if(n/i==i)
        res-=i;
    return res;
}
int main()
{
    int t;
    scanf("%d",&t);
    int o=1;
    while(t--)
    {
        long long n;
        scanf("%lld",&n);
        H(n);
        printf("Case %d: ",o++);
        printf("%lld\n",H(n));
    }
    return 0;
}

​

方法2:代码。

#include<stdio.h>
#include<math.h>
int main()
{
    int t,o=1;
    scanf("%d",&t);
    while(t--)
    {
        long long n;
        scanf("%lld",&n);
        long long t,sum=0;
        t=(long long)sqrt(n);
        for(int i=1;i<=t;i++)
            sum+=(n/i);
        sum*=2;
        sum=sum-t*t;
        printf("Case %d: %lld\n",o++,sum);
    }
    return 0;

}

 

<think>好的,用户想了解调和级数的数学定义和性质。首先,我需要回忆调和级数的基本概念,然后确认是否需要通过网络搜索补充更多详细信息或最新资料。 调和级数的定义是正整数的倒数之和,即H_n = 1 + 1/2 + 1/3 + ... + 1/n。但用户可能需要更严谨的数学表达式,包括通项公式和级数形式。另外,调和级数的发散性是一个关键性质,需要详细说明发散的原因,比如积分判别法或比较检验法的应用。 接下来是性质部分,包括发散速度、部分和公式近似以及与其他级数的关系。比如调和级数的部分和与自然对数的关系,H_n ≈ ln(n) + γ,其中γ是欧拉-马歇罗尼常数。发散速度较慢,可能需要举例说明需要多少项才能超过某个值。 还需要考虑调和级数的变体,比如交错调和级数是否收敛,以及调和级数在数学中的应用场景,比如在分析算法复杂度时的出现。此外,是否有必要提到p级数的一般情况,调和级数对应p=1的情况,此时p≤1时发散,p>1收敛。 现在需要调用网络搜索工具,核实这些信息的准确性,补充可能的遗漏点,比如是否有更精确的部分和公式,或者最新的研究成果。例如,确认欧拉-马歇罗尼常数的近似值,以及调和级数在数论或其他领域中的特殊性质。 在整理回答时,要分点列出定义和性质,避免使用步骤词汇,每个部分换行。确保数学公式用$或$$包裹,例如调和级数的定义写成$H_n = \sum_{k=1}^n \frac{1}{k}$,发散性证明中使用积分比较$\int_{1}^{N+1} \frac{1}{x} dx$。检查是否有需要代码的地方,比如计算部分和的示例代码,可能用Python展示如何计算H_n。 最后,生成相关问题时要基于用户的原问题,可能涉及调和级数的发散证明方法、与其他级数的比较,以及实际应用例子。确保相关问题符合格式要求,用§§标记,问题数量至少三个,编号正确。</think>调和级数指形如 $H_n = \sum_{k=1}^n \frac{1}{k}$ 的无穷级数,其通项为倒数序列。数学表达式可扩展为: $$H_n = 1 + \frac{1}{2} + \frac{1}{3} + \cdots + \frac{1}{n}$$ 当$n \to \infty$时称为调和级数发散问题。 **核心性质**: **发散特性**:调和级数是发散的,可通过积分判别法证明。比较定积分$\int_{1}^{N+1} \frac{1}{x} dx$可得$H_N > \ln(N+1)$,随着$N$增大无界增长 **渐近行为**:部分和满足近似关系$H_n = \ln n + \gamma + \frac{1}{2n} - \frac{1}{12n^2} + o(\frac{1}{n^2})$,其中$\gamma \approx 0.5772$为欧拉-马歇罗尼常数 **发散速率**:达到数值$S$需要约$e^{S-\gamma}$个项。例如达到$H_n > 10$需要约12367项 **特殊性质**: - 任意删除含数字9的项后级数收敛 - 奇数次项构成的子级数发散 - 交错调和级数$\sum_{k=1}^\infty (-1)^{k+1}\frac{1}{k}$条件收敛于$\ln 2$ 计算示例: ```python def harmonic_number(n): return sum(1/i for i in range(1, n+1)) print(harmonic_number(10)) # 输出2.9289682539682538 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值