Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาผลรวมของอนุกรม 1 + 2 + 2 + 3 + 3 + 3 + .. + n ใน C++


ในปัญหานี้ เราได้รับตัวเลข n ซึ่งหมายถึงเทอมที่ n ของอนุกรมนั้น งานของเราคือสร้าง โปรแกรมเพื่อค้นหาผลรวมของซีรีส์ 1 + 2 + 2 + 3 +3 + 3 + .. + n ใน C++ .

คำอธิบายปัญหา − ในที่นี้ เราจะหาผลรวมของอนุกรมที่มีพจน์ที่ n คือ n คูณผลรวมของหมายเลข n ซึ่งหมายความว่าเป็นชุดของเลขกำลังสอง

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

n = 4

ผลลัพธ์

30

คำอธิบาย

ผลรวมของอนุกรมจนถึงเทอมที่ 4 =1 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 4 =30

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาที่มีประสิทธิภาพมากที่สุดคือการใช้สูตรทั่วไปสำหรับผลรวมของอนุกรม

แต่มาพูดคุยถึงวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดที่อาจคิดได้

วิธีแก้ปัญหาที่ง่ายที่สุด ปัญหาคือโดยตรงโดยการเพิ่มจำนวนชุดจนถึง n การดำเนินการนี้จำเป็นต้องมีการวนซ้ำซ้อน 2 ลูป หนึ่งเทอมและวงในสำหรับค่าในแต่ละเทอม

อัลกอริทึม

เริ่มต้น − sumVar =0;

  • ขั้นตอนที่ 1 − วนรอบสำหรับ i -> 1 ถึง n.
    • ขั้นตอนที่ 1.1 − วนสำหรับ j -> 1 ถึง i.
      • ขั้นตอนที่ 1.1.1 − อัปเดต sumVar, sumVar+=i;
  • ขั้นตอนที่ 2 − พิมพ์ sumVar

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include <iostream>
using namespace std;
int calcSeriesSum(int n){
   int sumVar = 0;
   for(int i = 1; i <= n; i++){
      for(int j = 1; j <= i; j++){
         sumVar += i;
      }
   }
   return sumVar;
}
int main(){
   int n = 7;
   cout<<"The sum of series till "<<n<<" is "<<calcSeriesSum(n);
   return 0;
}

ผลลัพธ์

The sum of series till 7 is 140

วิธีแก้ปัญหานี้เรียบง่ายแต่ไม่ได้ผลเนื่องจากมีการวนซ้ำซ้อนสองรอบ ทำให้เวลาของลำดับมีความซับซ้อน O(n2) .

โซลูชันที่มีประสิทธิภาพ ขึ้นอยู่กับข้อเท็จจริงที่ว่าถ้าบวกตัวเลข (n) ในตัวมันเอง n ครั้ง จากนั้น ผลลัพธ์สามารถทำได้โดยการคูณตัวเลขด้วยตัวมันเอง

เช่น 5+5+5+5+5 =5*5

ดังนั้นเราจึงสามารถใช้การคูณแทนการวนซ้ำเพื่อแก้ปัญหาได้

อัลกอริทึม

เริ่มต้น − sumVal =0;

  • ขั้นตอนที่ 1 − ลูปสำหรับ i -> 0 ถึง n.
    • ขั้นตอนที่ 2 − อัปเดต sumVal, sumVal +=(i*i)

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include <iostream>
using namespace std;
int calcSeriesSum(int n){
   int sumVar = 0;
   for(int i = 1; i <= n; i++){
      sumVar += (i*i);
   }
   return sumVar;
}
int main(){
   int n = 7;
   cout<<"The sum of series till "<<n<<" is "<<calcSeriesSum(n);
   return 0;
}

ผลลัพธ์

The sum of series till 7 is 140

วิธีแก้ปัญหาดีกว่าเพราะใช้เพียงลูปเดียวและมีเวลาซับซ้อนของลำดับ O(n) แต่ก็ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดเท่าที่จะสามารถทำได้ในความซับซ้อนของเวลา O(1)

วิธีแก้ปัญหาที่มีประสิทธิภาพที่สุด กำลังใช้สูตรทั่วไปสำหรับผลรวมของอนุกรมที่กำหนด

ผลรวมของอนุกรม =

1 + 2 + 2 + 3 + 3 + 3 + …. N.

สามารถทำได้เป็น

1 + (2+2) + (3+3+3) + … + (N+N+N..N)
1*1 + 2*2 + 3*3 + … N*N.
12 + 22 + 32 + … N2.

$Sum =\sum_{\square=1}^\square\blacksquare\square^2$

สูตรสำหรับผลรวมของกำลังสองคือ n*(n+1)*(2n+1)/6 และเราสามารถหาผลรวมโดยใช้สูตรนี้ได้เช่นกัน

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include <iostream>
using namespace std;
int calcSeriesSum(int n){
   int sumVar = 0;
   sumVar = ((n*(n + 1)*( 2 * n + 1))/6 );
      return sumVar;
}
int main(){
   int n = 7;
   cout<<"The sum of series till "<<n<<" is "<<calcSeriesSum(n);
   return 0;
}

ผลลัพธ์

The sum of series till 7 is 140