本题来源于粉丝的求助。
关于粉丝求助的问题,我们会按照先后顺序来解答,并从公众号后台回复答案和解析。
书的最后一页 时间限制: 1000 ms 内存限制: 65536 KB【题目描述】
某本书的页码从1开始,小明算了算,总共出现了202个数1,编程求这本书一共有多少页?
【输入】
无
【输出】
一个正整数,即这本书一共有多少页。
【输入样例】
无
【输出样例】
不提供
说明
主要考查循环嵌套。
本题与下方题解的解题思路类似。
【题解·循环嵌套】1095:数1的个数
【信奥】如何深刻理解除法和取模运算(基础篇)
思路分析
本题的关键是“1”的数法。第1页肯定有1个1,但第11页、111页算几个1呢?其实,根据题意不难理解,是1的个数,而不是一页中如果含有1就算1个。例如第11页,算两个1,而不是1个1。所以,在数1的过程中,要把页码的每一位数字都拆分出来,如果含有1则累计。
从第1页开始,一页一页地数,很明显要使用循环,第一次循环数第1页,第二次循环数第2页,以此类推。而编写循环时,对于初学者而言,最难无疑是编写循环条件。从题目中得知,只要数到202个1便足够。所以,可以声明一个计数器变量cnt = 0,用于累计1的个数,只要计数器变量cnt小于202,则继续累计,直至cnt大于或等于202,则结束循环。代码如下:
接着,声明一个int类型变量i = 1,表示从第1页开始数。在循环中对变量i进行拆分。
所谓拆分,其实就是提取变量i的每一位数字,判断每一位数字是否等于1,如果等于1则计数器+1。拆分变量i会导致更改变量i的值,而变量i代表页码,不能更改,所以声明一个int类型的变量临时存储变量i的值。代码如下:
问:为什么拆分变量i的值需要使用循环?
答:因为变量i不清楚是几位数,使用循环可以对一个未知位数的整数进行拆分,通用性较强。
内层循环拆分过程:while(t)表示当t不等于0,则继续拆分。t%10取出个位数,t/10删除个位数。如此循环,一个未知位数的十位数字以上的数字会不断往右移,最终最高位变成个位时,再除以10就变成0,此时t = 0,也就拆分完,循环条件为假,退出循环。变量i++表示换下一页。代码如下:
最后就是输出,其中变量i代表页码。而变量在最后一次循环时表示最后一页,而循环最后一步是i++,此时变量就会比最后一页的页码大了1,所以输出时要-1。代码如下:
数据类型:最后一页的页码肯定不会很大,所有数据可选int类型。
解疑
问:本题最后一页的页码会不会不存在数字1,例如300?
答:不可能。因为数到最后一个1时才是最后一页,所以最后一页的页码肯定含有数字1。
问:假设数到第391页时刚好有202个1,那么391~400页都可能是最后一页,是否存在多种答案?
答:题目一般都会比较严谨,而经过测试最后一页的页码是510,,只有一个答案。
运行结果
参考代码 - C++
参考代码下载链接
https://pan.baidu.com/s/1dAJEsdYMDHGhPdL31LvWTg
提取码:dsbc
END
注:题目来源于粉丝求助,点击下方的【阅读原文】即可打开本题源码下载链接。
题解属于本微信公众号【大神编程】原创。