本题要求计算一个由多层累加构成的表达式:
其中 n 由用户输入,且 1<n≤100。例如,当 n=3 时,结果为 1+(1+2)+(1+2+3)=1+3+6=10。
该问题本质上可以看作连续自然数的“前缀和”再求和,是一道典型的循环累加或数学公式问题。
我们给出两种常见的解法:直接循环模拟和数学公式优化。
观察每一项的结构:
由等差数列求和公式,第 i 项的结果为:
于是整个表达式的值可以写成:
由于 n≤100,直接使用 for 循环累加每一项的值即可。代码非常简单,循环 n 次,每次计算当前的三角数并累加到总和。
对于更大的 n,我们可以进一步推导出一个闭式公式:
利用平方和公式 ∑i=1ni2=6n(n+1)(2n+1) 和等差数列求和公式 ∑i=1ni=2n(n+1),代入可得:
所以这道题也可以直接用公式 n * (n + 1) * (n + 2) / 6 一次算出结果。两种方法均能在题目给定数据范围内瞬间得出正确答案。
题目给出的 C++ 参考代码使用的是方法一(循环累加)。为方便阅读,这里展示一份修正了语法笔误后的完整代码:
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int n = 0; 6 cin >> n; 7 int sum = 0; 8 for (int i = 1; i <= n; i++) { 9 sum += (i + 1) * i / 2; // 第 i 项:1+2+...+i 的值 10 } 11 cout << sum << endl; 12 return 0; 13}
代码说明:
int n = 0; 定义变量 n 并初始化为0,随后用 cin >> n; 读取输入。int sum = 0; 定义累加器 sum,用于存储最终结果。for (int i = 1; i <= n; i++) 构建循环,i 从 1 递增到 n,代表当前处理的是第 i 项。(i + 1) * i / 2 计算的是 i(i+1)/2,即第 i 项的和。因为 i*(i+1) 必定是偶数,所以直接进行整数除法不会产生误差。sum += ... 将每一项的值累加到 sum 中。sum 即为答案。小提示:
原参考代码中的using namespace std;是笔误,正确的写法应为using namespace std;(std 前没有空格)。在实际比赛中要格外注意这类拼写问题。
n * (n + 1) * (n + 2) / 6,只需要常数次运算,时间复杂度为 O(1),在 n 非常大时优势更加明显。本题中 n 最大仅为 100,两种方法都能满足时间与内存限制。
累计相加问题是一道典型的循环求和或公式推导练习题。对于初学者,建议先掌握“循环模拟前缀和再累加”的思路,打好循环结构的基本功;当实力提升后,可以进一步尝试将其转化为闭式公式,从而用 O(1) 的时间解决。这不仅能加深对数列求和的感性和理性认识,也为今后解决更加复杂的累加问题打下基础。