P1554 梦中的统计

题目背景

Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。

题目描述

Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码( 0 … 9 0 \ldots 9 09):每一个数码在计数的过程中出现过多少次?

给出两个整数 M M M N N N,求在序列 [ M , M + 1 , M + 2 , … , N − 1 , N ] [M, M + 1, M + 2, \ldots, N - 1, N] [M,M+1,M+2,,N1,N] 中每一个数码出现了多少次。

输入格式

1 1 1 行: 两个用空格分开的整数 M M M N N N

输出格式

1 1 1 行: 十个用空格分开的整数,分别表示数码 0 … 9 0 \ldots 9 09 在序列中出现的次数。

1.题目分析

该题只要考查了对整型和字符数组的使用,以及对c语言字符串的理解。
大概讲一下题意,给出两个整数,需要遍历这两个整数之间的整数,在遍历过程中,求每一个数字中出现0到9的次数之和,最有打印一排数据分别表示0,1,2,3,4,5,6,7,8,9这些元素出现的总次数。

2.题目思路

先定义一个计算最终结果的数组,即0到9出现的次数统计,
键入M,N,写一个for循环遍历M到N之间的整数,遍历的过程中,定义一个足够大的字符串,将每一轮循环中的数字强转为字符串,再用for循环遍历得到的字符串,得到字符串的每一个字符,枚举0到9,在while循环中与字符进行比较,如果存在,则计数器数组相应下标数加一。
值得一提的是,需要定义一个临时下标,每一次遍历数字强转后的字符串时,必须将下标重置为0。

3.代码演示

#include 
#include 

int main() {
    int m, n;
    scanf("%d%d", &m, &n);
    //定义一个整型数组存储0到9出现的次数 初始化所有元素为0
    int arr[10] = {0};
    int count;
    //遍历m到n之间的数i
    for (int i = m; i <= n; ++i) {
        //创建一个临时字符串 ,存储m到n之间的数字
        //注意这里临时数组的大小要满足题目要求
        char str[20];
        //使用sprint函数将数字转换为字符串类型
        snprintf(str, sizeof(str), "%d", i);
        //遍历字符串,统计出现0到9的次数  存入目标数组arr
        for (int j = 0; j < strlen(str); ++j) {
            char c = str[j];
            count = 0;
            //枚举0到9 跟字符串数组的每一个元素比较
            while (count < 10) {
                //如果字符是相应的数字, 则目标数组相应下标的元素加一
                if (c == count + '0'){
                    arr[count]+=1;
                }
                count++;
            }
        }
    }

    //打印计数的数组元素
    for (int i = 0; i < 10; ++i) {
        printf("%d ",arr[i]);
    }
    return 0;
}


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