P1980 [NOIP2013 普及组] 计数问题

[NOIP2013 普及组] 计数问题

题目描述

试计算在区间 1 1 1 n n n 的所有整数中,数字 x x x 0 ≤ x ≤ 9 0\le x\le9 0x9)共出现了多少次?例如,在 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 
#include 


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' 对应的是48
            if (num_str[j] == x+48){
                count++;
            }
        }
    }
    //打印次数
    printf("%d",count);

    return 0;
}


你可能感兴趣的:(刷题go,go,go,算法,c++,数据结构)