奇偶自然数序列中范围的和


问题陈述包括在先奇后偶的自然数序列中查找范围的和。

该序列包含从 1 到 N 的所有奇数自然数,然后包含从 2 到 N 的所有偶数自然数,包括 N。序列的大小为 N。问题中会提供一个范围 [a,b],我们需要求出该范围内的序列和。这里 a 和 b 都包含在范围内。

例如,给定N=7

序列将首先包含从 1 到 N(即 7)的所有奇数自然数,然后包含从 1 到 7 的所有偶数。N 的值也包含在序列中。因此,序列将是 1, 3, 5, 7, 2, 4, 6。

1, 3, 5, 7, 2, 4, 6.

我们需要找到给定范围 a 和 b 内的序列和,其中 a 和 b 都包含在内。

在这个问题中,输入 a 和 b 表示必须计算序列和的范围,N 表示序列中的项目总数。我们的任务是打印范围 [a,b] 内的序列和。

示例

输入

a=3, b=6, N=8

输出

18

说明 − 输入中给定的 N 值为 8。序列将是 1, 3, 5, 7, 2, 4, 6, 8,因为它首先包含直到 8 的所有奇数自然数,然后是直到 8 的所有偶数自然数。范围 [3,6] 内的序列和将是

5+7+2+4=18,这就是我们需要的输出。

输入

a=1 , b=4, N=4

输出

10

说明 − 给定的 N 值为 4。序列包含直到 N 的所有奇数,然后是直到 N 的所有偶数。序列将是 1, 3, 2, 4。

范围 [1,4] 内的序列和是 1+3+2+4=10,这是输出。

让我们了解查找给定范围内的指定序列和的算法。

算法

创建序列,将其放入数组中,然后从数组中获取提供的范围的和,这可以作为问题的简单解决方案。这种方法的空间和运行时要求均为 O(N)。

我们可以通过遵循序列中的模式来考虑更好的方法。由于我们知道 N 的值,我们需要形成一个序列,其中它包含直到 N 的所有奇数自然数,然后是直到 N 的所有偶数自然数。

范围将给出为 [a,b],其中 a 和 b 都包含在内。我们可以简单地找到从 1 到 b 的序列和,并从中减去从 1 到 a−1 的序列和。这样我们就可以得到从 a 到 b 的序列和。

由于序列中有 N 个数字,其中首先包含所有奇数,然后是直到 N 的所有偶数,因此序列中的奇数个数将是如果 N 是偶数则为 N/2,如果 N 是奇数则为 (N/2)+1

我们可以使用 ceil() 函数找到 N 的序列中奇数的个数。

语法

double x;
ceil(x);

此函数返回大于或等于函数中传递的参数的最小整数。例如,x=2.4,该函数将返回 3,因为它是大于或等于 2.4 的最小整数。

使用 ceil() 函数,我们通过 ceil(N/2.0) 找到序列中奇数的个数,并通过N−ceil(N/2.0)找到序列中偶数的个数。

可以使用等差数列前 n 项和公式计算前 N 个奇数的和,因为它构成了一个首项为 1、公差为 2 的等差数列。

公式如下所示:

$\mathrm{S_{n}=\frac{n}{2}(2*a+(n−1)d),a=等差数列的首项,d=公差}$

$\mathrm{前 N 个奇数的和=\frac{N}{2}(2*1+(N−1)*2)}$

$\mathrm{=N^{2}}$

类似地,使用相同的公式,我们找到前 N 个偶数的和。这里首项将是 2,公差也将是 2。

$\mathrm{前 N 个偶数的和=\frac{N}{2}(2*2+(N−1)*2)}$

$\mathrm{=\frac{2*N}{2}(2+N−1)=N(N+1)}$

  • 为了找到范围 [a,b] 中直到 b 的序列和,我们将首先使用公式检查序列中奇数的个数。如果奇数的个数大于 b 的值,我们将简单地使用公式找到直到 b 的奇数和,即 b^2。

  • 对于 b 的值大于奇数个数的情况,我们将通过从 b 的值中减去奇数的个数来计算直到 b 位置的偶数个数,然后使用公式找到前 N 个偶数的和来找到直到 b 的所有偶数的和。

现在使用相同的过程,我们将找到直到 a−1 的序列和,并从中减去直到 b 的序列和,这将给我们提供给定范围(即 [a,b])内的序列和,其中 a 和 b 也包含在内。

为了在恒定时间内解决问题,我们将在我们的方法中使用此算法。

方法

在我们的方法中实现上述算法以查找给定范围内的和的步骤

  • 我们将创建一个函数来查找从第一个位置到第 p 个位置的序列和。

  • 我们将检查序列中 N 个数字的奇数个数是否大于指定的第 p 个位置,如果是,我们将简单地使用公式返回和为 p^2 来查找奇数的和,因为直到 p 的奇数个数将是前 p 个奇数。

  • 如果奇数的个数小于 p,那么我们将计算直到第 p 个位置的序列中偶数的个数,并将其用于公式中以查找偶数的和。

  • 使用该函数,我们将计算直到 b 的序列和,并从中减去直到 a−1 的序列和,以获得给定范围(即 [a,b])内的序列和。

示例

//C++ program to find the sum of the sequence within the given range [a,b]
#include <bits/stdc++.h>

using namespace std;

//function to find the sum of the sequence of N up to p position
//1,3,5,7,...N-1,2,4,6.....N
long long Sum(long long p, long long N)
{
    long long s=0; //to store the sum of the sequence till p
    
	// to find the number of odd numbers in the sequence till N
	long long odd_numbers = ceil(N / 2.0);

//if p is less than the number of odd numbers, find the sum of first p odd numbers
	if (p <= odd_numbers){
	s = p * p; //using the formula for sum of first p odd numbers
	return s;
    }

	//to store the number of even numbers in the sequence till p
	long long even_numbers = p - odd_numbers;

	//add the sum of odd numbers using the formula n^2 and even numbers using n(n+1)
	s = ((odd_numbers*odd_numbers)+ even_numbers*(even_numbers+1));
	
	return s; //return sum
}

int main()
{
	long long N,a,b;
	N=100;
	a=42;
	b=87;
	
	//to find the sum within the range [a,b] by subtracting the sum till b with sum till a-1
	long long ans = Sum(b,N) - Sum(a-1,N);
	
	//printing the output
	cout<<"The sum of the sequence within the range ["<<a<<","<<b<<"] : "<<ans<<endl;

	return 0;
}

输出

The sum of the sequence within the range [42,87] : 2225

时间复杂度− O(1),因为查找给定范围内的序列和所花费的时间是恒定的。

空间复杂度− O(1),因为我们在方法中没有使用任何额外的空间。

结论

本文讨论了查找给定范围内的序列和的问题,其中序列由直到 N 的奇数自然数和然后是直到 N 的偶数自然数组成。遵循序列中的模式,我们在本文中提出了一种高效的 C++ 算法,该算法可以在恒定时间内运行并占用恒定的空间。

我希望您在阅读本文后能够理解这个问题以及解决它的方法。

更新于:2023年8月28日

浏览量:107

开启您的职业生涯

完成课程获得认证

开始学习
广告