昆明贤邦网站建设友情链接检测方法
[NOIP2013 普及组] 计数问题
题目描述
试计算在区间 1 1 1 到 n n n 的所有整数中,数字 x x x( 0 ≤ x ≤ 9 0\le x\le9 0≤x≤9)共出现了多少次?例如,在 1 1 1 到 11 11 11 中,即在 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 1,2,3,4,5,6,7,8,9,10,11 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 1 1 出现了 4 4 4 次。
输入格式
2 2 2 个整数 n , x n,x n,x,之间用一个空格隔开。
输出格式
1 1 1 个整数,表示 x x x 出现的次数。
1.题目分析
该题有多种解法和思路,可以遍历1到n,对每个数字的个位,十位,千位,万位,十万位,判断是否为对应的整数。
也可以在遍历的过程中定义一个临时字符数组,直接判断每一个元素,从而得到出现的次数。
总的来说,各有千秋,第一种空间复杂度较低,第二种时间复杂度较低。
2.题目思路
直接遍历1到n,定义一个临时数组,使用snprintf()将整数转化为字符串并存储到临时数组中,同时遍历临时数组,判断x的出现次数。循环结束,打印结果即可。
3.代码实现
#include <stdio.h>
#include <string.h>int main() {int n;int count = 0;int x;scanf("%d %d", &n,&x);for (int i = 1; i <= n; ++i) {//定义一个临时存储的数组char num_str[10];//将整型转换为字符串存储到数组中snprintf(num_str, sizeof(num_str), "%d", i);//遍历临时数组,存在数字x则次数加一for (int j = 0; j< strlen(num_str); ++j) {//ASCii码中 '0' 对应的是48if (num_str[j] == x+48){count++;}}}//打印次数printf("%d",count);return 0;
}