ในปัญหานี้ เราได้รับตัวเลขสองตัว 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).
คำอธิบายปัญหา − ที่นี่ เราจะหาผลรวมของอนุกรมที่กำหนดจนถึงเทอมที่ n ตามค่าที่กำหนดของ k
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
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