「PAT乙级真题解析」Basic Level 1057 数零壹 (问题分析+完整步骤+伪代码描述+提交通过代码)
题设给定了"数零壹"的具体步骤, 所以这是一道模拟题, 主要是明确题目要求的步骤, 翻译成代码即可. 其中涉及: - 英文字母的判断 - 英文字母在字母表中的序号获取 - 各个数位的数字求和 - 二进制转换 - 二进制数的各个数位数字的统计
#算法#数据结构#需求分析#c语言#pat考试
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
问题分析
题设给定了"数零壹"的具体步骤, 所以这是一道模拟题, 主要是明确题目要求的步骤, 翻译成代码即可. 其中涉及:
- 英文字母的判断
- 英文字母在字母表中的序号获取
- 各个数位的数字求和
- 二进制转换
- 二进制数的各个数位数字的统计
完整描述步骤
-
获取输入: 给定的字符串
-
初始化计数器: 英文字母数字和 sum
-
对于字符串的每一个字符:
- 如果字符是[a, z]或者[A, Z], 则 sum 加上这个字母的序号
-
初始化0和1的计数器
-
二进制转换, 并在转换过程中统计0和1:
- 只要当前数值sum不等于0, 则进行以下操作:
- sum % 2 获得 某位的数字, 如果是1, 则1的计数器+1, 否则0的计数器+1
- sum = sum / 2
- 只要当前数值sum不等于0, 则进行以下操作:
-
输出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
- if 'a' <= char <= 'z':
- 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不等于0, 则进行以下操作:
- sum % 2 获得 某位的数字, 如果是1, 则1的计数器+1, 否则0的计数器+1
- sum = sum / 2
- 只要当前数值sum不等于0, 则进行以下操作:
-
输出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
- if 'a' <= char <= 'z':
- 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;
}