[PAT练级笔记] 44 Basic Level 1044 火星数字
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT乙级BasicLevelPractice 1044
问题分析
题设要求将给定的十进制数转为火星文, 以及将给定的转为十进制数。
所以核心需求是开发两个转化方法。
十进制转为火星文
题设设定火星人采用13进制计数, 而0-12在个位上和在高位上有对应的表示;
所以十进制转为火星文分为两个步骤: 十进制转为13进制数, 将0-12根据所在数位, 映射成对应火星文。
进制转换的方法前面在前面的题目中多次提及, 这里不再赘述.
将0-12映射成对应的火星文是典型的转换/映射, 可以用编程语言的键值对存储映射关系, 没有键值对类型的可以使用数组存储.
火星文转为十进制
这是"十进制转为火星文"的逆过程。所以分为两个步骤: 火星文映射为0-12得到13进制数, 将13进制数转为十进制数
判断是否是火星文
由于火星文中不存在阿拉伯数字, 所以判断给定字符串的第一位是不是数字即可知道给定的文本是十进制数还是火星文
完整描述步骤
- 获取输入
- 根据输入的第一位是不是数字判断输入是不是十进制数
- 如果是十进制数, 则转为火星文输出
- 转为13进制数
- 将个位的0-12进行映射
- 将高位的1-12进行映射
- 如果是火星文, 则转为是十进制
- 检查位数, 长度超过4位的是两位数; 长度等于4位的是0, 长度小于4位的, 属于其他情况(可能是个位数, 可能是高位整数)
- 如果长度超过4位
- 将前三位转为1-12
- 将剩余的数转为0-12
- 将两位13进制数转为十进制数
- 如果长度小于4位
- 将输入在0-12的火星文个位映射中进行匹配, 将结果输出
- (个位匹配不到时) 将输入在0-12的火星文高位映射中进行匹配, 将结果输出
- 如果是十进制数, 则转为火星文输出
伪代码描述
- get input: number_amount
- for each number:
- if number[0] >= ‘0’ and number[0] <= ‘9’:
- convert number into radix 13;
- mapping radix-13-number[0] and print the Mar number
- if radix-13-number[1] != 0:
- mapping radix-13-number[1] and print the Mar number
- else:
- if length(number) > 4:
- convert number[0:3] into 1-12
- convert number[4:end] into 0-12
- get and print the decimal number from radix-13-number
- else:
- find number in low-digit-Mars-number-mapping, and print the value
- find number in high-digit-Mars-number-mapping, and print the value
- if length(number) > 4:
- if number[0] >= ‘0’ and number[0] <= ‘9’:
完整提交代码
/*
# 问题分析
题设要求将给定的十进制数转为火星文, 以及将给定的转为十进制数。
所以核心需求是开发两个转化方法。
# 十进制转为火星文
题设设定火星人采用13进制计数, 而0-12在个位上和在高位上有对应的表示;
所以十进制转为火星文分为两个步骤: 十进制转为13进制数, 将0-12根据所在数位, 映射成对应火星文。
进制转换的方法前面在前面的题目中多次提及, 这里不再赘述.
将0-12映射成对应的火星文是典型的转换/映射, 可以用编程语言的键值对存储映射关系, 没有键值对类型的可以使用数组存储.
# 火星文转为十进制
这是"十进制转为火星文"的逆过程。所以分为两个步骤: 火星文映射为0-12得到13进制数, 将13进制数转为十进制数
# 判断是否是火星文
由于火星文中不存在阿拉伯数字, 所以判断给定字符串的第一位是不是数字即可知道给定的文本是十进制数还是火星文
# 完整描述步骤
1. 获取输入
2. 根据输入的第一位是不是数字判断输入是不是十进制数
- 如果是十进制数, 则转为火星文输出
- 转为13进制数
- 将个位的0-12进行映射
- 将高位的1-12进行映射
- 如果是火星文, 则转为是十进制
- 检查位数, 长度超过4位的是两位数; 长度等于4位的是0, 长度小于4位的, 属于其他情况(可能是个位数, 可能是高位整数)
- 如果长度超过4位
- 将前三位转为1-12
- 将剩余的数转为0-12
- 将两位13进制数转为十进制数
- 如果长度小于4位
- 将输入在0-12的火星文个位映射中进行匹配, 将结果输出
- (个位匹配不到时) 将输入在0-12的火星文高位映射中进行匹配, 将结果输出
# 伪代码描述
1. get input: number_amount
2. for each number:
- if number[0] >= '0' and number[0] <= '9':
- convert number into radix 13;
- mapping radix-13-number[0] and print the Mar number
- if radix-13-number[1] != 0:
- mapping radix-13-number[1] and print the Mar number
- else:
- if length(number) > 4:
- convert number[0:3] into 1-12
- convert number[4:end] into 0-12
- get and print the decimal number from radix-13-number
- else:
- find number in low-digit-Mars-number-mapping, and print the value
- find number in high-digit-Mars-number-mapping, and print the value
*/
#include <stdio.h>
#include <string.h>
char Mars_digits[13][5] = {"tret", "jan", "feb", "mar", "apr", "may", "jun",
"jly", "aug", "sep", "oct", "nov", "dec"};
char Mars_high_rank_digits[13][5] = {"XXXX", "tam", "hel", "maa", "huh",
"tou", "kes", "hei", "elo", "syy",
"lok", "mer", "jou"};
void convert_decimal_to_radix_13(char *number) {
int length;
for (length = 0; number[length]; length++)
;
int decimal_number = 0;
for (int i = 0; i < length; i++) {
decimal_number = decimal_number * 10 + (int)number[i] - '0';
}
int Mars_number[2] = {0};
Mars_number[0] = decimal_number % 13;
Mars_number[1] = decimal_number / 13;
if (Mars_number[1] != 0) {
printf("%s", Mars_high_rank_digits[Mars_number[1]]);
}
if (Mars_number[1] != 0 && Mars_number[0] != 0) {
printf(" ");
}
if (Mars_number[0] != 0 || decimal_number == 0) {
printf("%s", Mars_digits[Mars_number[0]]);
}
printf("\n");
}
void convert_Mars_radix_to_decimal(char *Mars_string) {
int length;
for (length = 0; Mars_string[length]; length++)
;
if (length > 4) {
char high[4] = {0};
for (int i = 0; i < 3; i++) high[i] = Mars_string[i];
int decimal_number = 0;
for (int i = 0; i < 13; i++) {
if (strcmp(high, Mars_high_rank_digits[i]) == 0) {
decimal_number = decimal_number * 13 + i;
}
}
char low[4] = {0};
for (int i = 0; i < 3; i++) low[i] = Mars_string[i + 4];
for (int i = 0; i < 13; i++) {
if (strcmp(low, Mars_digits[i]) == 0) {
decimal_number = decimal_number * 13 + i;
}
}
printf("%d\n", decimal_number);
} else {
for (int i = 0; i < 13; i++) {
if (strcmp(Mars_string, Mars_digits[i]) == 0) {
printf("%d\n", i);
}
}
for (int i = 0; i < 13; i++) {
if (strcmp(Mars_string, Mars_high_rank_digits[i]) == 0) {
printf("%d\n", i * 13);
}
}
}
}
int main() {
int number_amount;
scanf("%d\n", &number_amount);
char number[10];
int Mars_number[2];
for (int i = 0; i < number_amount; i++) {
fgets(number, sizeof(number), stdin);
number[strcspn(number, "\n")] = 0;
if (number[0] >= '0' && number[0] <= '9') {
convert_decimal_to_radix_13(number);
} else {
convert_Mars_radix_to_decimal(number);
}
}
return 0;
}