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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP