1095:数1的个数时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给定一个十进制正整数n(1≤n≤10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。
例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。
【输入】
正整数n。1 ≤ n ≤ 10000。
【输出】
一个正整数,即“1”的个数。
【输入样例】
12
【输出样例】
5
说明:
主要考查嵌套循环。
思路分析:
本题与下面题解使用了相同的循环嵌套框架:
【题解·循环】1091:求阶乘的和
【题解·循环嵌套】1092:求出e的值
【题解·循环嵌套】1093:计算多项式的值
【题解·循环嵌套】1094:与7无关的数
外层循环遍历1~n,共循环n次。每循环遍历一个数字时,在内层循环中统计该数含有多少个1,并把数目累计在计数器中。
而统计某个数含有1的数目,使用了前面题解的方法。即循环判断某数的每一位上的数字是否等于1。
数据类型:本题无特别之处,所有变量可选择int类型。
易错点:
个别同学理解成【数字含有1就当一个】,而实际上,一个数含有多少个1就算多少个。像111这个数字含有3个1,不是算一个,而是算3个。
运行结果:
参考代码 - C++:
#include
using namespace std;
int main(){
int n, cnt = 0; // cnt是计数器,用于累计1的数目
cin >> n;
for (int i = 1; i <= n; i++)
{
int t = i; // 因不能修改i,所以声明t临时存储i的值
while (t)
{
if (t % 10 == 1) cnt++; // 如果个位数等于1,则累计
t /= 10; // 删除个位数
}
}
cout < return 0;
}
END
注:题目来源于网络,转载于《信息学奥赛一本通(C++版)在线评测系统》,点击下方的【阅读原文】即可打开该题的链接。
题解属于本微信公众号【大神编程】原创。