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

พิมพ์ผลรวมที่เป็นไปได้ทั้งหมดของตัวเลขต่อเนื่องด้วยผลรวม N ใน C++


ในปัญหานี้ เราได้รับจำนวนเต็มบวก N และเราต้องพิมพ์ลำดับของจำนวนที่ต่อเนื่องกันที่เป็นไปได้ทั้งหมดด้วยผลรวมเท่ากับ N

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

Input: N = 15
Output: 1 2 3 4 5
7 8

วิธีแก้ไขง่ายๆ สำหรับปัญหานี้คือการเพิ่มชุดค่าผสมต่อเนื่องกันจนถึง N/2 แล้วพิมพ์ลำดับที่รวมกันเป็น N

ตัวอย่าง

#include<iostream>
using namespace std;
void printConsequtiveSum(int N){
   int start = 1, end = (N+1)/2;
   while (start < end){
      int sum = 0;
      for (int i = start; i <= end; i++){
         sum = sum + i;
         if (sum == N){
            for (int j = start; j <= i; j++)
               cout<<j<<" ";
               cout<<endl;
               break;
         }
         if (sum > N)
            break;
      }
      sum = 0;
      start++;
   }
}
int main(){
   int N = 25;
   cout<<"Sequence of consicutive numbers that sum upto "<<N<<" are :\n";
   printConsequtiveSum(N);
   return 0;
}

ผลลัพธ์

ลำดับของตัวเลขต่อเนื่องกันที่รวมกันได้ถึง 25 คือ −

3 4 5 6 7
12 13

วิธีนี้ง่ายแต่ไม่ได้ผล

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

ตัวอย่าง

#include <iostream>
using namespace std;
void printConsequtiveSum(int N){
   int start = 1, end = 1;
   int sum = 1;
   while (start <= N/2){
      if (sum < N){
         end += 1;
         sum += end;
      }
      else if (sum > N){
         sum -= start;
         start += 1;
      }
      else if (sum == N){
         for (int i = start; i <= end; ++i)
            cout<<i<<" ";
            cout<<endl;
            sum -= start;
            start += 1;
      }
   }
}
int main(){
   int N = 25;
   cout<<"Sequence of consicutive numbers that sum upto "<<N<<" are:\n";
   printConsequtiveSum(N);
   return 0;
}

ผลลัพธ์

ลำดับของตัวเลขต่อเนื่องกันที่รวมกันได้ถึง 25 คือ −

3 4 5 6 7
12 13