PTA编程题:个位数统计

个位数统计

  • 问题描述
  • 思路分析
    • 详细步骤
    • 关键点
    • 复杂度分析
  • 参考代码(C语言)
    • 代码分析
    • 程序的核心逻辑
    • 关键技巧

问题描述

PTA编程题:个位数统计_第1张图片

思路分析

  1. 输入格式

    • 输入一个正整数 N,它可以包含最多1000位数字。
    • 需要从中统计出每个数字(0到9)的出现次数。
  2. 输出格式

    • 输出每个不同的个位数字及其在 N 中出现的次数。
    • 输出的格式是 数字:次数,并且按数字从小到大的顺序输出。
  3. 分析问题

    • 由于输入的数字最多有1000位,且数字范围从 0 到 9,所以我们只需要统计每个数字的出现次数。
    • 我们不需要处理整数的数学运算,只需要逐个读取字符串中的字符,并统计其对应的数字。
    • 字符串中的每个字符代表一个数字,字符 '0''9' 可以通过减去字符 '0' 转换为对应的数字。
  4. 数据结构选择

    • 使用一个长度为 10 的数组 digit_count[10] 来记录每个数字出现的次数。数组的下标 0 对应数字 0,下标 1 对应数字 1,以此类推。初始化时数组的值为 0。
    • 遍历字符串中的每个字符,将其转换为相应的数字,然后增加 digit_count 数组对应下标的计数。
  5. 程序设计步骤

    • 输入读取:输入一个大整数 N,存储为字符串。
    • 统计数字出现次数:通过遍历字符串,统计每个数字出现的次数。
    • 输出统计结果:遍历 digit_count 数组,输出出现次数大于0的数字及其次数,按照升序输出。

详细步骤

  1. 读取输入:首先读取一个字符串表示的大整数。
  2. 初始化计数器:使用一个大小为 10 的数组 digit_count[10] 来记录每个数字(0-9)出现的次数。
  3. 统计数字出现次数
    • 遍历输入字符串中的每个字符,判断该字符表示的数字,并更新相应数字的计数。
    • 例如,字符 '5' 表示数字 5,可以通过 digit_count[5]++ 来更新该数字的计数。
  4. 输出结果
    • 按照数字升序(从 0 到 9)遍历 digit_count 数组,输出出现次数大于0的数字和它们的计数。

关键点

  • 字符与数字的转换:通过字符 '0' 转换为数字,可以使用 N[i] - '0' 来得到该字符代表的数字。
  • 输出格式:输出的格式需要严格按照题目要求,即 数字:次数 的形式。

复杂度分析

  • 时间复杂度:由于我们需要遍历输入字符串中的每一个字符,时间复杂度为 O(k),其中 k 是输入字符串的长度(最多 1000)。
  • 空间复杂度:我们只需要一个大小为 10 的数组来存储数字的出现次数,因此空间复杂度为 O(1),即常数空间。

参考代码(C语言)

#include 
#include 

#define MAX_LEN 1001  // 最多1000位数字

int main() {
    char N[MAX_LEN];
    int digit_count[10] = {0};  // 用来统计0到9每个数字的出现次数
    
    // 输入大整数
    scanf("%s", N);
    
    // 统计每个数字的出现次数
    for (int i = 0; N[i] != '\0'; i++) {
        digit_count[N[i] - '0']++;
    }
    
    // 输出每个数字出现的次数,按照数字升序
    for (int i = 0; i < 10; i++) {
        if (digit_count[i] > 0) {
            printf("%d:%d\n", i, digit_count[i]);
        }
    }
    
    return 0;
}

代码分析

  1. #include #include

    • stdio.h 是标准输入输出库,用于处理输入输出。
    • string.h 库提供字符串相关的函数,虽然这个程序并未直接使用 string.h 中的复杂函数,但通过 strlen 等函数也可能提供帮助。
  2. #define MAX_LEN 1001

    • 定义了常量 MAX_LEN 为 1001,这表示最大能够处理的数字长度为1000位。这里使用 1001 是因为字符串的末尾需要一个额外的字符 '\0' 作为结束标志。
  3. char N[MAX_LEN];

    • 定义了一个字符数组 N 来存储输入的大整数。最大支持 1000 位数字,加上结束符 \0 总共最多存储 1001 个字符。
  4. int digit_count[10] = {0};

    • 定义一个大小为 10 的整型数组 digit_count,用来统计每个数字(0到9)出现的次数。数组元素初始化为 0,即 digit_count[0] 表示数字 0 的出现次数,digit_count[1] 表示数字 1 的出现次数,依此类推。
  5. scanf("%s", N);

    • 使用 scanf 函数从标准输入读取一个字符串,并将其存储到 N 中。此时,输入的大整数作为字符串处理,避免了对大整数的数学运算操作。比如,对于输入 100311N 将存储为字符串 "100311"
  6. for (int i = 0; N[i] != '\0'; i++) { digit_count[N[i] - '0']++; }

    • 这是一个 for 循环,用于遍历字符串 N 中的每个字符。
      • N[i] 获取字符串中的每个字符。
      • N[i] - '0' 将字符转换为对应的数字。例如,字符 '1' 会转换为数字 1,字符 '0' 会转换为数字 0。
      • digit_count[N[i] - '0']++ 表示根据转换后的数字增加相应的计数。即数字 0 的计数增加,数字 1 的计数增加,依此类推。

    例如,对于输入 "100311",经过这一轮循环,digit_count 数组会被更新为:

    digit_count[0] = 2
    digit_count[1] = 3
    digit_count[3] = 1
    

    其他数字的计数保持为 0。

  7. for (int i = 0; i < 10; i++) { if (digit_count[i] > 0) { printf("%d:%d\n", i, digit_count[i]); } }

    • 这个 for 循环用于遍历 digit_count 数组,从 0 到 9,检查每个数字的出现次数。
    • if (digit_count[i] > 0) 用于判断当前数字是否在输入中出现过。如果出现过,则输出该数字及其出现次数。
    • printf("%d:%d\n", i, digit_count[i]); 按照 数字:次数 的格式输出每个出现的数字及其次数。
      • 例如,对于输入 "100311",输出将会是:
        0:2
        1:3
        3:1
        
      • 数字按升序输出,从 0 到 9。
  8. return 0;

    • 程序正常结束时返回 0,表示程序执行成功。

程序的核心逻辑

  • 统计每个数字出现的次数:程序通过将每个字符转化为相应的数字,并更新 digit_count 数组来统计每个数字的出现次数。
  • 按升序输出结果:程序按数字 0 到 9 的顺序遍历 digit_count 数组,输出出现次数大于 0 的数字及其次数。

关键技巧

  • 字符与数字的转换:通过 N[i] - '0',将字符表示的数字转换为实际的数字索引。这种技巧可以有效地处理字符和整数之间的映射。
  • 字符串的遍历:程序通过逐个字符处理字符串,实现了对大整数的有效遍历与统计。

你可能感兴趣的:(算法题,编程题,算法)