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

备战大晨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 |
|
输入 1234,输出 10;输入 999,输出 27。
大晨不信邪,非要拿自己生日试:20170612,回车,屏幕吐出 19。他在草稿纸上把 2+0+1+7+0+6+1+2 加了一遍,真是 19,乐了:”电脑还会算生日!”
翻车现场:我的 4 呢
第一次自己敲,他把两行顺序写反了:
1 | n = 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++ 下编译通过,但不构成任何教学建议。每个孩子进度不一样,仅供参考,欢迎交流,不喜勿杠。


