文章

【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项是1
    • 第2项是1+2
    • 第3项是1+2+3
    • 第n项是1+2+3+…+n
  2. 计算思路:
    • 每一项都是从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 进行授权