이 문제에서는 급수에 대해 두 개의 숫자 n과 k가 제공됩니다. 우리의 임무는 C++에서 주어진 시퀀스의 합을 찾는 프로그램을 만드는 것입니다.
순서는 -
(1*2*3*...*k) + (2*3*...k*(k+1)) + (3*4*...*k*k+1*k+2) + ((n-k+1)*(nk+ 2)*... *(n-k+k).
문제 설명 − 여기에서 주어진 k값을 기준으로 n번째 항까지 주어진 급수의 합을 구합니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력
n = 4, k = 3
출력
30
설명
Series: (1*2*3) + (2*3*4) = 30
솔루션 접근 방식
간단한 해결책은 반복을 사용하여 합을 찾는 것입니다. 각 항에 대해 하나씩, 항의 값을 찾는 데 두 번째 루프를 사용합니다. 그런 다음 각 항의 값을 더하여 결과를 얻습니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include <iostream> using namespace std; int findSeriesSum(int n, int k){ int sumVal = 0, term = 1; for(int i = 1; i <= (n-k + 1); i++){ term = 1; for(int j = i; j< (k+i); j++){ term *= j; } sumVal += term; } return sumVal; } int main(){ int n = 4, k = 3; cout<<"The sum of series is "<<findSeriesSum(n, k); return 0; }
출력
The sum of series is 30
이 솔루션은 O(n 2 차수의 시간 복잡도를 만드는 중첩 루프가 필요하므로 효율적이지 않습니다. ).
효율적인 솔루션 시리즈에 대한 일반 공식을 사용할 수 있습니다. 공식은,
$\frac{(\square+1)*\square*(\square-1)*(\square-2)*....*(\square-\square+1)}{\square+1}$
우리 솔루션의 작동을 설명하는 프로그램
예시
#include <iostream> using namespace std; int findSeriesSum(int n, int k){ int sumVal = 1; for(int i = n+1; i > n-k; i--) sumVal *= i; sumVal /= (k + 1); return sumVal; } int main(){ int n = 4, k = 3; cout<<"The sum of series is "<<findSeriesSum(n, k); return 0; }
출력
The sum of series is 30