এই সমস্যায়, আমাদের একটি ধনাত্মক পূর্ণসংখ্যা 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