ในปัญหานี้ เราได้รับจำนวนเต็มบวก 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