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為止,將有N/2個偶數/奇數。即有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

更新於:2020年8月6日

334 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.