「PAT乙级真题解析」Basic Level 1057 数零壹 (问题分析+完整步骤+伪代码描述+提交通过代码)
乙级练习题主要用于帮助学习者熟悉编程语言的基础语法以及养成良好的编程习惯和编写规范。
从小白开始逐步积累用编程解决问题的能力。
问题分析
该题设定明确给出了"数零壹"的具体操作流程,并且属于模拟性练习范畴。核心在于准确理解题目所需完成的任务,并将其直接转换为相应的代码实现。其中涉及算法设计与实现细节等技术要点的阐述与探讨。
- 字母识别
- 确定字母在字母表中的位置
- 计算各位数字之和
- 实现二进制数转换过程
- 统计二进制各位数字的数量
完整描述步骤
获取输入: 给定的字符串
初始化计数器: 英文字母数字和 sum
对于字符串的每一个字符:
* 如果字符是[a, z]或者[A, Z], 则 sum 加上这个字母的序号
初始化0和1的计数器
二进制转换, 并在转换过程中统计0和1:
当sum≠0时执行以下步骤:
首先计算sum除以2得到某一位上的数字值。
如果该位为1,则将计数器one加一;否则将计数器zero加一。
然后将sum赋值为自身的一半。
输出0和1的个数
伪代码描述
-
get input: content
-
init sum = 0;
-
for char in content:
-
if ‘a’ <= char <= ‘z’:
- sum += (char - ‘a’) + 1
-
else if ‘A’ <= char <= ‘Z’:
- sum += (char - ‘A’) + 1
-
-
init zero_amount = 0, one_amount = 0;
-
while sum != 0:
-
digit = sum % 2
-
if digit == 1:
- one_amount++
-
else:
- zero_amount++
-
sum = sum / 2
-
-
print(zero_amount, one_amount)
问题分析
该题设定明确给出了"数零壹"的具体实施步骤, 因此这道题目属于模拟类题目, 其核心目标在于要求考生能够根据设定的具体流程进行操作. 在实现过程中会遇到的问题包括具体的数学公式推导和编程细节实现等.
- 确定英文字母
- 获取英文字母在其字母表中的位置编号
- 计算各数位上的数字之和
- 实现二进制与十进制之间的转换过程
- 统计二进制数值中每一位的具体数值情况
完整描述步骤
获取输入: 给定的字符串
初始化计数器: 英文字母数字和 sum
对于字符串的每一个字符:
* 如果字符是[a, z]或者[A, Z], 则 sum 加上这个字母的序号
初始化0和1的计数器
二进制转换, 并在转换过程中统计0和1:
当sum不为零时, 执行如下操作: 计算sum对2取余, 当余数为1时, 将1计数器加一; 否则将0计数器加一. 然后令sum等于其值的一半.
输出0和1的个数
伪代码描述
-
get input: content
-
init sum = 0;
-
for char in content:
-
if ‘a’ <= char <= ‘z’:
- sum += (char - ‘a’) + 1
-
else if ‘A’ <= char <= ‘Z’:
- sum += (char - ‘A’) + 1
-
-
init zero_amount = 0, one_amount = 0;
-
while sum != 0:
-
digit = sum % 2
-
if digit == 1:
- one_amount++
-
else:
- zero_amount++
-
sum = sum / 2
-
-
print(zero_amount, one_amount)
完整提交代码
/*
# 问题分析
题设给定了"数零壹"的具体步骤, 所以这是一道模拟题, 主要是明确题目要求的步骤, 翻译成代码即可.
其中涉及:
- 英文字母的判断
- 英文字母在字母表中的序号获取
- 各个数位的数字求和
- 二进制转换
- 二进制数的各个数位数字的统计
# 完整描述步骤
1. 获取输入: 给定的字符串
2. 初始化计数器: 英文字母数字和 sum
3. 对于字符串的每一个字符:
- 如果字符是[a, z]或者[A, Z], 则 sum 加上这个字母的序号
4. 初始化0和1的计数器
5. 二进制转换, 并在转换过程中统计0和1:
- 只要当前数值sum不等于0, 则进行以下操作:
- sum % 2 获得 某位的数字, 如果是1, 则1的计数器+1, 否则0的计数器+1
- sum = sum / 2
6. 输出0和1的个数
# 伪代码描述
1. get input: content
2. init sum = 0;
3. for char in content:
- if 'a' <= char <= 'z':
- sum += (char - 'a') + 1
- else if 'A' <= char <= 'Z':
- sum += (char - 'A') + 1
4. init zero_amount = 0, one_amount = 0;
5. while sum != 0:
- digit = sum % 2
- if digit == 1:
- one_amount++
- else:
- zero_amount++
- sum = sum / 2
6. print(zero_amount, one_amount)
*/
# include<stdio.h>
void counter_amount_of_zero_and_one(int number){
int zero_amount = 0;
int one_amount = 0;
while (number != 0){
if (number % 2 == 0) zero_amount++;
else one_amount++;
number /= 2;
}
printf("%d %d", zero_amount, one_amount);
}
int main(){
char content[100002];
fgets(content, 100002, stdin);
int sum = 0;
for (int i = 0; content[i]; i++){
if (content[i] >= 'a' && content[i] <= 'z'){
sum += content[i] - 'a' + 1;
}
if (content[i] >= 'A' && content[i] <= 'Z'){
sum += content[i] - 'A' + 1;
}
}
counter_amount_of_zero_and_one(sum);
return 0;
}
