题目描述:
给定一个整数T,计算该整数可以有多少种连续自然数之和的表达方式,并打印出每种表达式。例如,对于整数9,有以下三种表达式:1) 9=9,2) 9=4+5,3) 9=2+3+4。
输入描述:
一个目标整数T(1 <= T <= 1000)。
输出描述:
输出整数T的所有表达式和表达式的个数。如果有多种表达式,按照以下规则输出:
- 自然数个数最少的表达式优先输出;
- 每个表达式中按照自然数递增的顺序输出;
- 数字与符号之间无空格。
示例1:
输入:
9
输出:
9=9
9=4+5
9=2+3+4
Result: 3
示例2:
输入:
18
输出:
18=18
18=1+2+3+4+5+6-7
Result: 2
答案如下:
#include <iostream>
#include <vector>
using namespace std;
// 找到整数T的所有连续自然数之和的表达式,并打印出来
void findExpressions(int T) {
vector<vector<int>> expressions; // 保存表达式
int start = 1; // 连续自然数之和的起始位置
int end = 2; // 连续自然数之和的结束位置
while (start <= end) {
int sum = (start + end) * (end - start + 1) / 2; // 计算连续自然数之和
if (sum == T) { // 如果找到表达式
vector<int> expression; // 保存当前表达式
for (int i = start; i <= end; i++) {
expression.push_back(i); // 添加自然数到表达式中
}
expressions.push_back(expression); // 添加表达式到结果集合中
start++; // 更新起始位置,继续寻找下一个表达式
} else if (sum < T) { // 连续自然数之和小于T
end++; // 增加结束位置
} else { // 连续自然数之和大于T
start++; // 增加起始位置
}
}
// 输出表达式
for (const auto& expression : expressions) {
cout << T << "=";
for (int i = 0; i < expression.size(); i++) {
cout << expression[i];
if (i < expression.size() - 1) {
cout << "+";
}
}
cout << endl;
}
// 输出表达式的个数
cout << "Result:" << expressions.size() << endl;
}
int main() {
int T;
cin >> T;
findExpressions(T);
return 0;
}