C++ 第一奇数然后偶数自然数序列中的范围和
问题陈述包括找出在序列中第一个奇数然后偶数自然数的范围和,直到N为止。
该序列包含从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 。
我们需要找出给定范围[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。该序列包含从1到N的所有奇数,然后是从1到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,因为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^2。
-
当b的值大于奇数的个数时,我们将通过将b的值与奇数的个数相减来找到序列中的偶数个数,然后使用公式找到前N个偶数的和,以找到所有偶数的和直到b。
现在,使用相同的方法,我们将找到序列直到a−1的和,并从序列直到b的和中减去它,这将给出我们在[a,b]
范围内的序列的和,其中也包括a和b。
我们将在我们的方法中使用此算法,以在常数时间内解决问题。
方法
实现上述算法以找到给定范围内和的步骤:
- 我们将创建一个函数来计算从第一个位置到第pth位置的序列的总和。
-
我们将检查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),因为我们在解决方法中没有使用任何额外的空间。
结论
本文讨论了在给定范围内找到序列和的问题,其中序列由从1到N的奇数和从1到N的偶数组成。根据序列的模式,我们在本文中提出了一个在C++中运行的高效算法,它具有恒定的时间复杂度和空间复杂度。
希望您在阅读本文后能够理解这个问题和解决方法。