【GESP】C++一级真题练习(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,代表第几项
- 内层直接用等差数列求和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int ans = 1;
for (int i = 1; i <= n; i++) {
if (i > 1) {
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
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++) {
ans += (n - (i - 1)) * i;
}
cout << ans;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
本文由作者按照 CC BY 4.0 进行授权