202306-累计相加(luogu-B3839)
GESP一级真题练习。为2023年6月一级认证真题。根据给出数列规律,计算累加后的结果。
luogu-B3839 累计相加
题目要求
描述
输入一个正整数 n,求形如:1+(1+2)+(1+2+3)+(1+2+3+4)+⋯+(1+2+3+4+5+⋯+n) 的累计相加。
输入
输入一个正整数 n。约定 1< n ≤100。
输出
输出累计相加的结果。
输入样例-1
3
输出样例-1
10
输入样例-2
4
输出样例-2
20
输入样例-3
10
输出样例-3
220
题目分析
这道题目主要考察数列求和。需要注意以下几点:
题目给出的是一个特殊的数列求和:
- 第1项是1
- 第2项是1+2
- 第3项是1+2+3
- 第n项是1+2+3+…+n
计算思路:
- 每一项都是从1加到当前数字的一个等差数列
- 例如n=3时:
第1项=1
第2项=1+2=3
第3项=1+2+3=6 总和=1+3+6=10 - 可以使用循环嵌套来计算
- 外层循环i从1到n,代表第几项
- 内层直接用等差数列求和
示例代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入正整数n
int ans = 1; // 初始化结果为1,因为第一项就是1
// 从第2项开始循环到第n项
for (int i = 1; i <= n; i++) {
if (i > 1) {
// 第i项的值是1+2+3+...+i,使用等差数列求和公式:(首项+末项)*项数/2
ans += (1 + i) * i / 2;
}
}
cout << ans; // 输出累计相加的结果
return 0;
}
另外一个解题思路是,总结数列规律,n项时,有n个1,n-1个2,n-2个3,以此类推到1个n。
例如当n=3时:
- 有3个1: 第1项有1个,第2项有1个,第3项有1个
- 有2个2: 第2项有1个,第3项有1个
- 有1个3: 第3项有1个
所以可以用通项表达式求和直接计算: An = (n - (i - 1)) * i
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入正整数n
int ans = 0; // 初始化累计相加的结果为0
// 根据规律:第i个数字在前n项中出现(n-i+1)次
// 例如n=3时,1出现3次,2出现2次,3出现1次
for (int i = 1; i <= n; i++) {
ans += (n - (i - 1)) * i; // 累加每个数字i乘以它的出现次数
}
cout << ans; // 输出累计相加的结果
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
“luogu-”系列题目可在 洛谷题库 在线评测。
“bcqm-”系列题目可在 编程启蒙题库 在线评测。
GESP/CSP 认证学习微信公众号

Last updated on