文章

【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
15
16
17
18
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权