📌  相关文章
📜  谐波级数的总和

📅  最后修改于: 2021-04-21 22:34:12             🧑  作者: Mango

给定整数N ,任务是找到谐波序列的总和\sum_{i=1}^{n} \lfloor{n/i}\rfloor

例子:

天真的方法:1N之间运行一个循环,找到N / i的下限值的总和。这种方法的时间复杂度为O(n)

高效方法:使用以下公式来计算序列的总和:
 $\sum_{i=1}^n\lfloor\frac ni\rfloor=2\sum_{i=1}^k\lfloor\frac ni\rfloor-k^2$ for $k=\lfloor\sqrt n\rfloor$
现在,循环需要从1运行到sqrt(N) ,时间复杂度降低为O(sqrt(N))

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the summation of
// the given harmonic series
long long int getSum(int n)
{
  
    // To store the summation
    long long int sum = 0;
  
    // Floor of sqrt(n)
    int k = sqrt(n);
  
    // Summation of floor(n / i)
    for (int i = 1; i <= k; i++) {
        sum += floor(n / i);
    }
  
    // From the formula
    sum *= 2;
    sum -= pow(k, 2);
  
    return sum;
}
  
// Driver code
int main()
{
    int n = 5;
  
    cout << getSum(n);
  
    return 0;
}


Java
// Java implementation of the approach 
class GFG 
{
      
    // Function to return the summation of 
    // the given harmonic series 
    static long getSum(int n) 
    { 
      
        // To store the summation 
        long sum = 0; 
      
        // Floor of sqrt(n) 
        int k = (int)Math.sqrt(n); 
      
        // Summation of floor(n / i) 
        for (int i = 1; i <= k; i++)
        { 
            sum += Math.floor(n / i); 
        } 
      
        // From the formula 
        sum *= 2; 
        sum -= Math.pow(k, 2); 
      
        return sum; 
    } 
      
    // Driver code 
    public static void main (String[] args)
    { 
        int n = 5; 
      
        System.out.println(getSum(n)); 
    } 
}
  
// This code is contributed by AnkitRai01


Python3
# Python3 implementation of the approach
from math import floor, sqrt, ceil
  
# Function to return the summmation of
# the given harmonic series
def getSum(n):
  
    # To store the summmation
    summ = 0
  
    # Floor of sqrt(n)
    k =(n)**(.5)
  
    # Summation of floor(n / i)
    for i in range(1, floor(k) + 1):
        summ += floor(n / i)
  
    # From the formula
    summ *= 2
    summ -= pow(floor(k), 2)
  
    return summ
  
# Driver code
n = 5
  
print(getSum(n))
  
# This code is contributed by Mohit Kumar


C#
// C# implementation of the approach 
using System;
      
class GFG 
{
      
    // Function to return the summation of 
    // the given harmonic series 
    static double getSum(int n) 
    { 
      
        // To store the summation 
        double sum = 0;
      
        // Floor of sqrt(n) 
        int k = (int)Math.Sqrt(n); 
      
        // Summation of floor(n / i) 
        for (int i = 1; i <= k; i++)
        { 
            sum += Math.Floor((double)n / i); 
        } 
      
        // From the formula 
        sum *= 2; 
        sum -= Math.Pow(k, 2); 
      
        return sum; 
    } 
      
    // Driver code 
    public static void Main (String[] args)
    { 
        int n = 5; 
      
        Console.WriteLine(getSum(n)); 
    } 
}
      
// This code is contributed by PrinciRaj1992


输出:
10