备战大晨7月 GESP C++ 1级(26):for 循环的看家本领——累加器,还顺手踩了 int 溢出的坑

上一篇结尾我说,for 循环的”初始化、条件、更新”三件套,大晨已经捋顺了,让他睡一晚消化消化。结果第二天一早他主动凑过来:”爸,循环除了数数还能干啥?”我说干啥?for 循环的看家本领,今天就上——累加器。

按《一本通·编程启蒙 C++ 版》的进度,咱们正好翻到循环结构的应用部分。GESP 1 级真题里,求和、计数这类题是常客,这篇必须掰透。

从 1 加到 100 说起

我先给大晨出了道老题:1+2+3+……+100 等于几?

他抄起草稿纸就要竖式,我拦住他,讲了高斯的故事——小高斯发现 1+100=101,2+99=101,一共 50 个 101,几秒交卷,答案 5050。

大晨听完幽幽来一句:“高斯这不就是偷懒吗?他偷懒被表扬两百年,我考试抄近道为啥挨说?”

我一时语塞,缓了半天说:程序员这行的本事,一大半就是”合理偷懒”——把重复的活儿丢给机器。来,写个程序,输入 n,输出 1 加到 n。

累加器:准备一个空盒子,往里不停扔

思路很简单:准备一个变量 sum,一开始等于 0,然后循环 n 次,每次把 i 扔进 sum 里。

大晨看到 sum = sum + i; 直接懵了:”自己加自己?数学老师看到这个等式会打叉的。”

这里必须掰清楚:程序里的 = 不是等号,是赋值号——先算右边的,再把结果存回左边。 sum = sum + i 的意思是”取出 sum 的旧值,加上 i,再塞回 sum”。以后还会碰到简写 sum += i,一个意思。

还有条铁律:循环开始前,累加器必须先清零。 忘了初始化,盒子里装的是上一顿的剩饭,加出来多少全看天意。

代码上桌

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
int n;
cin >> n; // 加到几
int sum = 0; // 累加器,先清零
for (int i = 1; i <= n; i++) {
sum = sum + i; // 也可以写 sum += i
}
cout << sum << endl;
return 0;
}

大晨输入 100,回车,屏幕蹦出 5050。他扭头看我:”高斯用了几秒,我用了不到一秒,我是不是比高斯强?“我说行行行你强,但思路是人家两百年前想出来的。

大晨踩的坑:5050 变成了 705082704

小子上头了,非要拿大数试试,敲了个 100000 进去,屏幕输出 705082704。

他刚要欢呼,我让他用高斯公式验一下:100000 × 100001 ÷ 2 = 5000050000。跟屏幕上的对不上,差得离谱。

这就是 int 溢出——int 这个盒子大约装到 21 亿(2147483647)就满了,再往里塞就出乱数,关键是它不报错。 这种”看起来不像错的错答案”,考试里最坑人。

修法简单,一个词的事:把 int sum = 0; 改成 long long sum = 0;。long long 能装到 922 亿亿,信奥圈管这叫”开 long long”。改完再跑,5000050000,分毫不差。

大晨盯着屏幕感慨:”原来数字也会爆仓啊。”话糙理不糙。

顺手再学一招:计数器

累加器会了,计数器就是买一送一。比如:输入 n 个数,数一数有几个偶数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
int n, x, cnt = 0; // cnt 是计数器,同样先清零
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x;
if (x % 2 == 0) {
cnt = cnt + 1; // 也可以写 cnt++
}
}
cout << cnt << endl;
return 0;
}

区别一句话说清:累加器加的是”东西”,计数器加的是”次数”。 一个 sum += i,一个 cnt++,长得像双胞胎,干的是两样的活。

老父亲陪跑小结

今晚全程 45 分钟,落袋三条:累加器先清零;= 是赋值不是等式;大数开 long long。收工前大晨憋出一句让我乐了半天的话:”高斯就是人肉版 for 循环。“好家伙,学以致用了属于是。

下一篇难度上一小截——我给大晨出了道”打印一面星星墙”的题,循环里还得再套一层循环,结果他打出来的不是墙,是一截楼梯。到底哪出了问题,下篇见分晓。

免责声明:本文只是我家娃备考路上的陪跑记录,代码在我们电脑上跑通过,知识点如有讲得不严谨的地方,欢迎各位老师留言指正。