B3650 [语言月赛 202208] 求和
一、题目理解
1.1 题目要求
从输入中读取一个正整数 n,然后从 1 开始逐个累加到 n。每加一个数,就把当前的累加和输出一次,共输出 n 行。
输入格式:
-
一行:一个正整数 n
输出格式:
-
共 n 行,第 i 行表示从 1 累加到 i 的和
1.2 样例模拟
假设输入为 5。
意思是:从 1 开始,依次加到 5。
我们逐步计算并输出:
-
第 1 步:sum = 0 + 1 = 1,输出 1
-
第 2 步:sum = 1 + 2 = 3,输出 3
-
第 3 步:sum = 3 + 3 = 6,输出 6
-
第 4 步:sum = 6 + 4 = 10,输出 10
-
第 5 步:sum = 10 + 5 = 15,输出 15
因此输出为五行:第一行 1,第二行 3,第三行 6,第四行 10,第五行 15。
二、核心思想:累加器法
2.1 什么是累加器法?
想象有一个存钱罐,一开始是空的(值为 0)。
-
第 1 天存入 1 元,存钱罐里现在有 1 元,报告一次余额。
-
第 2 天再存入 2 元,存钱罐里现在有 3 元,报告一次余额。
-
第 3 天再存入 3 元,存钱罐里现在有 6 元,报告一次余额。
-
以此类推,直到第 n 天存入 n 元,报告最后一次余额。
每次存入后都报告一次,这就是“累加求和并逐步输出”。
2.2 为什么这种方法可行?
因为题目要求的是“边加边输出”,而不是“全部加完再输出”。所以每完成一次加法,就要立刻输出当前的和。用一个变量 sum 持续累加,每次加完就输出,逻辑非常直接。
2.3 为什么用 long long 而不是 int?
因为 n 可能很大时,累加和会超出 int 的表示范围(int 最大约 21 亿)。例如当 n 达到 10 万时,累加和约为 50 亿,已经超过 int 上限。用 long long 可以表示约 9×10¹⁸ 的整数,足够安全。
三、程序执行流程逐步解析
下面按照程序实际执行的顺序,逐步讲解每一步在做什么。所有代码片段在文末统一给出,这里只讲逻辑。
【第 1 步】程序开始
程序从主函数开始执行。首先需要准备变量:
-
一个用来存放输入上限的变量,记为 n,类型为 long long。
-
一个用来存放累加和的变量,记为 sum,类型为 long long,初始化为 0。
同时,为了让程序能进行输入输出操作,需要使用标准输入输出流。
【第 2 步】读入 n
从输入流中读取一个整数,存入 n。这个 n 表示要累加到的最大数字。
以假设的样例为例,此时 n = 5。
【第 3 步】初始化累加和
将 sum 初始化为 0。
为什么必须初始化为 0?
因为 sum 是用来“累加”的。如果初始值不是 0(比如是随机值),那么第一次加法就会出错。C++ 中局部变量不会自动初始化为 0,所以必须手动写等于 0。
【第 4 步】循环累加并逐步输出
这是整个程序的核心部分。使用一个循环,循环变量 i 从 1 开始,每次加 1,直到 i 大于 n 时停止。因此循环体会执行 n 次。
(1)累加
每次循环,把当前的循环变量 i 加到 sum 上。即 sum 更新为 sum + i。
-
第 1 次循环:sum = 0 + 1 = 1
-
第 2 次循环:sum = 1 + 2 = 3
-
第 3 次循环:sum = 3 + 3 = 6
-
第 4 次循环:sum = 6 + 4 = 10
-
第 5 次循环:sum = 10 + 5 = 15
(2)输出
每次累加完后,立刻输出当前的 sum,并换行。
注意: 输出语句写在循环体内,所以每加一次就输出一次,共输出 n 行。如果写在循环体外,就只会输出最后一行。
(3)循环结束后
循环结束后,程序已经输出了 n 行结果。
#include<bits/stdc++.h> // 万能头文件 using namespace std; int main(){ //0.定义 n long long n, sum = 0; // n:累加上限 sum:累加和,必须初始化为 0 //1.输入 n cin >> n; // 读入累加上限 //2.遍历1 到 n 的数字存放到循环变量i for(int i = 1; i <= n; i++){ // 循环 n 次,i 从 1 到 n //3.sum + i sum = sum + i; // 把当前 i 累加到 sum 上 cout << sum << "\n"; // 立刻输出当前累加和并换行 } return 0; }

浙公网安备 33010602011771号