备战大晨7月GESP C++ 1级(24):拆数字!用while循环求各位数字之和

上一篇末尾我说过,while 循环光会在屏幕上”数数”不算本事,得拿它干点真活儿。这个系列一晃写到第 24 篇,《一本通·编程启蒙》也刷到了循环的应用题。今天这个真活儿,是信奥题里的老面孔——拆数字:把一个整数的每一位拆开,求和。

大晨拿到题第一反应:”爸爸,1234 是一个数啊,怎么拆?”

我说别急,先给你两把刀。

两把刀:% 和 /

拆数字,核心就两个动作,记住了走到哪儿都不慌。

n % 10:把最后一位”拿”出来。 比如 1234 % 10 = 4。百分号叫取余,除以 10 剩下的余数,正好就是个位。

n / 10:把最后一位”扔”掉。 比如 1234 / 10 = 123。注意,整数除整数,C++ 里结果还是整数,小数部分不是四舍五入,是直接砍掉。

我给大晨打了个比方:嗑瓜子。% 是看一眼手里这颗,/ 是把壳吐掉,一颗一颗来,嗑到袋子里没瓜子为止。

他追问:那除到什么时候停?

好问题。除到 n 变成 0,就该停了——这不就是 while 循环的条件嘛,n > 0 就接着嗑。

完整代码,直接能编译

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 sum = 0; // 累加器,先归零
while (n > 0) {
sum = sum + n % 10; // 拿出个位,加进sum
n = n / 10; // 扔掉个位,继续拆
}
cout << sum << endl; // 输出各位数字之和
return 0;
}

输入 1234,输出 10;输入 999,输出 27。

大晨不信邪,非要拿自己生日试:20170612,回车,屏幕吐出 19。他在草稿纸上把 2+0+1+7+0+6+1+2 加了一遍,真是 19,乐了:”电脑还会算生日!”

翻车现场:我的 4 呢

第一次自己敲,他把两行顺序写反了:

1
2
n = n / 10;
sum = sum + n % 10;

输入 1234,输出 6。他盯着屏幕半天:”爸爸,我的 4 呢?”

我让他拿笔一步步演:第一轮就把 1234 除成了 123——4 还没来得及加进 sum,就先被扔了。先加后除,顺序一步不能乱。

改完他自己又嘀咕:”那要是忘了写 n = n / 10,是不是就死循环了?”对,上个月他就干过一次,屏幕哗哗刷数字停不下来,因为 n 一直不变,条件永远成立。

孩子不是听不懂,是没把”拿”和”扔”在脑子里演一遍。 碰到这种错,别急着讲道理,扔给他一张草稿纸,手动模拟两轮循环,比我说十遍都管用。

为什么现在就啃这块

我翻了翻近两年的 GESP 一级真题,各位数字之和、数位数、倒序输出,出镜率不低。拆数字是信奥入门绕不过去的基本功,往后学水仙花数、回文数,全靠这两把刀吃饭。

咱们的目标一直是明年 7 月那次一级,时间还够,不赶进度,一块一块啃瓷实。大晨现在三年级,晚上七点半开工,25 分钟一节,今天全程自己敲自己调,老父亲我只负责递草稿纸和保温杯。

小结

  • n % 10 拿个位,n / 10 扔个位
  • 循环条件 n > 0,拆到 0 为止
  • 先加再除,顺序反了个位就白扔了
  • 忘了 n = n / 10,就是死循环

临睡前大晨突然冒出一句:”爸爸,那能不能把 1234 变成 4321,倒着打出来?”

我端着保温杯愣了两秒——好小子,问到点子上了。下一篇,咱们玩”数字倒着走”:倒序输出一个整数的每一位。 敬请期待。

免责声明:本文是自家娃的备考陪跑记录,代码均在 Dev-C++ 下编译通过,但不构成任何教学建议。每个孩子进度不一样,仅供参考,欢迎交流,不喜勿杠。