备战大晨7月 GESP C++ 1级(25):倒序拆数,%10 和 /10 这对黄金搭档

备战大晨7月 GESP C++ 1级(25):倒序拆数,%10 和 /10 这对黄金搭档
强仔上篇的坑,今天来填
上篇结尾我卖了个关子:给你一个整数,怎么把它每一位倒着输出?昨晚大晨刷牙的时候还在琢磨,含着一嘴泡沫问我:“爸爸,是不是得先算出它有几位?”
我说你先别急,今天这 25 分钟就干这一件事。
两把刀:%10 取一位,/10 砍一位
《一本通》循环这一章的应用题里,拆数是绕不开的坎。核心就两句:
n % 10:取出个位。123 % 10 = 3。n / 10:砍掉个位。123 / 10 = 12。注意整数除法直接丢小数,不是 12.3。
拿 123 给大晨演示:取走 3 剩 12,取走 2 剩 1,取走 1 剩 0。每一步“取一位、砍一位”,数就一层层剥开了。大晨听完来了句:“那不就是拆快递吗,一层一层拆。”行吧,这个比喻我记下了。
大晨的直线思维
他第一反应是不用循环:“三位数我学过啊!个位、十位、百位存进三个变量,倒着 cout 出来不就行了?”
没错,上一课分离三位数那招他记得挺牢。但我随手写了个 12345,他沉默了——总不能定义五个变量吧?位数一多就歇菜,这就是硬编码的天花板。我趁热打铁:你发现没有,“取一位、砍一位”这个动作是重复的,重复的活儿归谁管?
大晨一拍大腿:“while!”
代码:管你几位数
1 |
|
输入 123,输出 321;输入 98765,输出 56789。位数随便加,代码一个字不用改。
那个 n == 0 的特判是大晨自己撞出来的——他输 0 测试,屏幕空空如也,愣了半天。我提示他:循环条件是 n > 0,0 根本进不去,谁替它打印?他“哦——”了一声补上了。自己撞出来的坑,比别人指出来的坑记得牢十倍。
踩坑与 021 事件
第一遍敲代码他忘了写 n = n / 10;,程序疯狂刷屏同一个数字,吓得他直喊:“爸爸它停不下来了!”我教他按 Ctrl+C,顺便讲了什么叫死循环。少写一行就这样,这教训比我念叨十遍都管用。
还有个彩蛋:他输入 120,输出 021,自己乐了:“021,上海的区号!”对,倒序输出会把前导零也吐出来。这是“打印每一位”和“真正的数值”之间的区别,先记住这个现象,后面有大用。
小结
- 拆数两板斧:
%10取位,/10砍位; - 重复动作交给 while,条件写
n > 0; - 记得特判 0,警惕死循环,前导零属正常现象。
下篇预告:我反手又出了一题——不许打印,要把 123 真的变成 321 这个数,存回变量里。大晨盯着屏幕憋了五分钟:“倒着打印我会了,倒着攒一个数怎么攒啊?”其实钥匙就藏在今天这对黄金搭档里。下篇揭晓,敬请期待。
免责声明:本文仅为老父亲陪娃备考的真实记录,学习方法因娃而异,代码不保证最优,题解不保证唯一,杠就是你对。


