本题参照用《用连续自然数之和来表达整数》的思想,从后向前遍历,第一个符合的序列即为最短的连续自然数分解序列
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void print(vector<int> arr, int n){
string s = to_string(n)+"=";
for(int i = 0;i<arr.size();i++){
s += to_string(arr[i]);
if(i<arr.size() - 1){
s+="+";
}
}
cout << s << endl;
}
//最短连续自然数之和
int main() {
int num;
while(cin >> num){
for(int i = num-1;i>0;i--){//最短的和,最后一位最大
//故从后往前遍历,参考odc卷第三题
vector<int> arr;
int sum = 0;
bool flag = false;
for(int j = i;j>0;j++){
//压入数组
arr.push_back(j);
sum += j;
if(sum == num){//找到最短连续和,输出
print(arr, num);
flag = true;
break;
}
else if(sum>num){
break;
}
}
if(flag){
break;
}
}
}
}