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