Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 arr[i] =i * (-1)^i일 때 배열의 인덱스 L에서 R까지 요소의 합


이 문제에서는 두 개의 숫자 L과 R이 제공됩니다. 또한 arr[i] =i*(-1)^i와 같은 배열 arr[]도 있습니다. . 우리의 임무는 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