1. 题目背景与需求分析
"PTA B1021 个位数统计"是程序设计类题目中典型的数字处理问题。这类题目常见于编程初学者练习和在线评测系统(如PTA、LeetCode等),主要考察以下几个核心能力:
- 数字与字符串的转换处理
- 数组或哈希表的基本应用
- 格式化输出技巧
具体到本题,典型的需求场景是:给定一个不超过1000位的正整数N,统计其中每个数字(0-9)出现的次数,并按数字升序输出统计结果。例如输入"100311",应输出:
code复制0:2
1:3
3:1
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 输入数据的特殊性处理
本题的关键特征在于输入数字的位数可能非常大(不超过1000位),这直接决定了我们不能用常规的整数类型存储:
- C/C++中即使使用
long long类型(最大约10^19)也无法存储 - Java的
BigInteger虽可处理,但操作复杂 - Python等动态类型语言虽无此限制,但题目本意考察算法而非语言特性
因此最优解是将输入当作字符串处理,这也是本题的第一个考察点。
2.2 统计方案的实现选择
统计数字出现次数通常有三种实现方式:
- 数组计数法(推荐)
c复制int count[10] = {0}; // 初始化计数器
for(char c : str) {
count[c-'0']++; // 字符转数字索引
}
- 哈希表法
python复制from collections import defaultdict
count = defaultdict(int)
for d in input_str:
count[int(d)] += 1
- 数学取模法(不适用于大数)
c复制while(n > 0){
count[n%10]++;
n /= 10;
}
在算法竞赛和教学场景中,数组法因其高效简洁(时间复杂度O(n),空间复杂度O(1))成为首选方案。这也是本题希望考察的核心实现方式。
3. 完整代码实现与逐行解析
3.1 C语言实现版本
c复制#include <stdio.h>
#include <string.h>
int m
