在这个问题中,我们得到一个正整数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