「PAT乙级真题解析」Basic Level 1021 个位数统计 (问题分析+完整步骤+伪代码描述+提交通过代码)
题目要求统计的其实是: 统计给定整数各个数位上数字的出现次数。 这意味着: 我们需要获取这个数各个数位上的数字。
#算法#数据结构#需求分析#pat考试#c语言
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
问题分析
题目要求统计的其实是: 统计给定整数各个数位上数字的出现次数。 这意味着: 我们需要获取这个数各个数位上的数字。
获取给定整数各个数位上的数字
我们之前的题目中提过, 获取各个数位数字, 可以考虑把数当数值处理, 也可以把数存储成字符串处理. 如果之后要从左往右访问各个数字或者需要排序数字, 则当作字符串处理会更方便. 这里没有这些需求, 所以数字和字符串都可以. 但是当作数值处理还是考虑数值表示范围(数值溢出)的问题, 这里的整数最大可以有1000位, 可能溢出, 所以采用字符串处理方案.
完整描述步骤
- 获取给定整数, 储存为字符串
- 依次访问字符串的各个字符, 将字符对应的数字记录下来
- 依次访问记录的数字和数字出现的次数, 将出现次数非0的数字和频率打印出来
伪代码描述
- get input number (as string)
- set a frequency recorder, and init frequency of each digit as 0
- for char in number: digit_value = char_to_digit(char) recorder[digit_value] += 1
- for digit and frequency in recorder: if frequency != 0: print("digit:frequency")
完整提交代码
/*
# 问题分析
题目要求统计的其实是: 统计给定整数各个数位上数字的出现次数。
这意味着: 我们需要获取这个数位上的数字。
## 获取给定整数各个数位上的数字
我们之前的题目中提过, 获取各个数位数字, 可以考虑把数当数值处理, 也可以把数存储成字符串处理.
如果之后要从左往右访问各个数字或者需要排序数字, 则当作字符串处理会更方便. 这里没有这些需求, 所以数字和字符串都可以.
但是当作数值处理还是考虑数值表示范围(数值溢出)的问题, 这里的整数最大可以有1000位, 可能溢出, 所以采用字符串处理方案.
# 完整描述步骤
1. 获取给定整数, 储存为字符串
2. 依次访问字符串的各个字符, 将字符对应的数字记录下来
3. 依次访问记录的数字和数字出现的次数, 将出现次数非0的数字和频率打印出来
# 伪代码描述
1. get input number (as string)
2. set a frequency recorder, and init frequency of each digit as 0
3. for char in number:
digit_value = char_to_digit(char)
recorder[digit_value] += 1
4. for digit and frequency in recorder:
if frequency != 0:
print("digit:frequency")
*/
int main(){
char number[3000];
scanf("%s", number);
int digits_count[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; number[i]; i++){
int digit = (int)number[i] - (int)'0';
digits_count[digit] ++;
}
for (int i = 0; i < 10; i++){
if (digits_count[i] != 0){
printf("%d:%d\n", i, digits_count[i]);
}
}
}