C++ 第一奇数然后偶数自然数序列中的范围和

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++中运行的高效算法,它具有恒定的时间复杂度和空间复杂度。

希望您在阅读本文后能够理解这个问题和解决方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程