给定整数N ,任务是找到谐波序列的总和 。
例子:
Input: N = 5
Output: 10
floor(3/1) + floor(3/2) + floor(3/3) = 3 + 1 + 1 = 5
Input: N = 20
Output: 66
天真的方法:在1到N之间运行一个循环,找到N / i的下限值的总和。这种方法的时间复杂度为O(n) 。
高效方法:使用以下公式来计算序列的总和:
现在,循环需要从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