इस समस्या में, हमें एक धनात्मक पूर्णांक 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