「PAT乙级真题解析」Basic Level 1064 朋友数 (问题分析+完整步骤+伪代码描述+提交通过代码)
这道题依旧是一道"给出定义要求计算"的题目, 计算之后要求做的是统计. (1063谱半径是要求再最值) 所以依旧是按照定义翻译成程序语言, 然后进行常规统计. 再次强调,统计数据要关注统计的是哪些数据以及存储形式, 这里统计的是数值出现的次数, 所以只需要用数组存储即可. 由于题设给定"朋友数"是各个数位上数字的和, 涉及到各个数位数字的读取(可以用整数存储然后不断取余, 这题的数值也不会有溢出问题), 以下采用字符串形式存储数值用索引访问各位数字的方式进行计算。
#算法#数据结构#c语言#需求分析#pat考试
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT乙级BasicLevelPractice 1064 朋友数
问题分析
这道题依旧是一道"给出定义要求计算"的题目, 计算之后要求做的是统计. (1063谱半径是要求再最值) 所以依旧是按照定义翻译成程序语言, 然后进行常规统计. 再次强调,统计数据要关注统计的是哪些数据以及存储形式, 这里统计的是数值出现的次数, 所以只需要用数组存储即可. 由于题设给定"朋友数"是各个数位上数字的和, 涉及到各个数位数字的读取(可以用整数存储然后不断取余, 这题的数值也不会有溢出问题), 以下采用字符串形式存储数值用索引访问各位数字的方式进行计算。
完整描述步骤
- 获取输入: 整数个数(要进行计算的次数), 各个整数
- 初始化统计器
- 数字和出现次数计数器
- 不同数字和个数计数器
- 对于每一个整数:
- 计算各个数位上数字之和
- 在统计器中将数字和出现的次数+1
- 如果当前次数==1, 则说明出现了一个与之前不同的数字和, 不同数字和个数计数器值+1
- 输出不同数字和个数计数器的值
- 按递增顺序输出统计次数大于0的数字和
伪代码描述
- get input: case_amount, numbers
- init counter:
- digits_sum_frequency[40] = {0};
- count = 0;
- for each number in numbers:
- init sum = 0
- for each digit of number:
- sum += digit
- digits_sum_frequency[sum]++;
- if digits_sum_frequency[sum] == 0:
- count++;
- print(count);
- for each sum and frequency in sorted(digits_sum_frequency):
- if frequency > 0:
- print(sum)
- if frequency > 0:
完整提交代码
/*
# 问题分析
这道题依旧是一道"给出定义要求计算"的题目, 计算之后要求做的是统计. (1063谱半径是要求再最值)
所以依旧是按照定义翻译成程序语言, 然后进行常规统计.
再次强调,统计数据要关注统计的是哪些数据以及存储形式, 这里统计的是数值出现的次数, 所以只需要用数组存储即可.
由于题设给定"朋友数"是各个数位上数字的和, 涉及到各个数位数字的读取(可以用整数存储然后不断取余, 这题的数值也不会有溢出问题),
以下采用字符串形式存储数值用索引访问各位数字的方式进行计算。
# 完整描述步骤
1. 获取输入: 整数个数(要进行计算的次数), 各个整数
2. 初始化统计器
- 数字和出现次数计数器
- 不同数字和个数计数器
3. 对于每一个整数:
- 计算各个数位上数字之和
- 在统计器中将数字和出现的次数+1
- 如果当前次数==1, 则说明出现了一个与之前不同的数字和, 不同数字和个数计数器值+1
4. 输出不同数字和个数计数器的值
5. 按递增顺序输出统计次数大于0的数字和
# 伪代码描述
1. get input: case_amount, numbers
2. init counter:
- digits_sum_frequency[40] = {0};
- count = 0;
3. for each number in numbers:
- init sum = 0
- for each digit of number:
- sum += digit
- digits_sum_frequency[sum]++;
- if digits_sum_frequency[sum] == 0:
- count++;
4. print(count);
5. for each sum and frequency in sorted(digits_sum_frequency):
- if frequency > 0:
- print(sum)
*/
# include<stdio.h>
int main(){
int case_amount;
scanf("%d", &case_amount);
int digits_sum_frequency[40] = {0};
char number[6];
int count = 0;
for (int i = 0; i < case_amount; i++){
scanf("%s", number);
int sum = 0;
for (int j = 0; number[j]; j++){
sum += number[j] - '0';
}
digits_sum_frequency[sum]++;
if (digits_sum_frequency[sum] == 1){
count++;
}
}
printf("%d\n", count);
for (int i = 0; i < 40; i++){
if (digits_sum_frequency[i] > 0){
count--;
if (count == 0){
printf("%d", i);
} else {
printf("%d ", i);
}
}
}
return 0;
}