202306-累计相加(luogu-B3839)

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,代表第几项
    • 内层直接用等差数列求和

示例代码

#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 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on