在C ++中,当arr [i] = i *(-1)^ i时,数组中从索引L到R的元素的总和

在这个问题中,我们给了两个数字L和R。我们还有一个数组arr [],使得arr [i] = i *(-1)^ i。我们的任务是创建一个程序,以在arr [i] = i *(-1)^ i时计算数组中从索引L到R的元素之和。

因此,我们需要找到数组[L,R]范围内的元素之和。

让我们举个例子来了解这个问题,

输入值 

L = 2 , R = 6

输出结果 

4

说明 

arr[] = {-1, 2, -3, 4, -5, 6}

Sum = 2+ (-3) + 4 + (-5) + 6 = 4

解决该问题的简单方法是运行从L到R的循环,然后将所有偶数相加并减去所有奇数。然后最后返回总和。

示例

该程序说明了我们解决方案的工作原理,

#include <iostream>

#include <math.h>

using namespace std;

int CalcArrSumLtoR(int L, int R) {

   int sum = 0;

   for (int i = L; i <= R; i++){

      sum += (i * pow((-1), i));

   }

   return sum;

}

int main() {

   int L = 3, R = 15;

   cout<<"Sum of elements of array from index "<<L<<" to "<<R<<" is "lt;lt;CalcArrSumLtoR(L, R);

   return 0;

}

输出结果

Sum of elements of array from index 3 to 15 is -9

这不是一种有效的方法,它将解决O(n)时间复杂度的问题。

一个有效的解决方案是对n个奇数之和使用公式。所以,

前n个奇数之和= n * n

前n个偶数之和= n *(n + 1)

在这里,最终的总和将计算为

sum = (sum of first R even number - sum of first (L-1) even number ) - (sum of first R odd number - sum of first (L-1) odd number )

*将有N / 2个偶数/奇数,直到nie将有R / 2个偶数。因此,我们将使用R / 2和L / 2来计算总和。

示例

该程序说明了我们解决方案的工作原理,

#include <iostream>

using namespace std;

long int findSum(int n, bool isEven) {

   long int total = 0;

   if(isEven == true){

      total = (n) / 2;

      return (total * (total+1));

   }

   else {

      total = (n + 1) / 2;

      return total * total;

   }

}

int CalcArrSumLtoR(int L, int R) {

   return (findSum(R, true) - findSum(L - 1, true))- (findSum(R, false) - findSum(L - 1, false));

}

int main() {

   int L = 3, R = 15;

   cout<<"Sum of elements of array from index "<<L<<" to "<<R<<" is "<<CalcArrSumLtoR(L, R);

   return 0;

}

输出结果

Sum of elements of array from index 3 to 15 is -9

以上是 在C ++中,当arr [i] = i *(-1)^ i时,数组中从索引L到R的元素的总和 的全部内容, 来源链接: utcz.com/z/343433.html

回到顶部