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