当前位置: 首页 > news >正文

[PAT练级笔记] 44 Basic Level 1044 火星数字

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT乙级BasicLevelPractice 1044

问题分析

题设要求将给定的十进制数转为火星文, 以及将给定的转为十进制数。
所以核心需求是开发两个转化方法。

十进制转为火星文

题设设定火星人采用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

完整提交代码

/*
# 问题分析
题设要求将给定的十进制数转为火星文, 以及将给定的转为十进制数。
所以核心需求是开发两个转化方法。

# 十进制转为火星文
题设设定火星人采用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;
}

相关文章:

  • LeetCode题目笔记——01.09. 字符串轮转
  • 玩转Vue3全家桶02丨上手:一个清单应用帮你入门Vue
  • 武汉东西湖区小进规市场主体奖励申报条件、材料及流程梳理
  • 数据模型dataModel遍历图元时并且要移除指定时,不能在遍历循环中dm.remove(),需要做好标记在新的循环中移除,否则会影响前面循环遍历本身!
  • 高等数学(第七版)同济大学 习题8-1 个人解答
  • 如何顺时针或者逆时针记录多边形的每个点
  • 体验 Shifu 解决报错流程
  • SpringBoot+Vue项目在线学习网站
  • antd tree 懒加载+局部刷新
  • c# RestClient 请求接口
  • 为了面试大厂,熬夜肝完这份 “测试” 笔记后,我终于“硬”了一回
  • T1095 数1的个数(信息学一本通C++)
  • 八、class 与 style 绑定(1)
  • 职言 | 编码是测试自动化职业生涯的关键:你准备好了吗?
  • 92-Java的缓冲流概述、体系、字节缓冲流使用
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • express + mock 让前后台并行开发
  • HTML5新特性总结
  • Java IO学习笔记一
  • java多线程
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • windows下如何用phpstorm同步测试服务器
  • Zsh 开发指南(第十四篇 文件读写)
  • 彻底搞懂浏览器Event-loop
  • 动态规划入门(以爬楼梯为例)
  • 翻译:Hystrix - How To Use
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端_面试
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 正则与JS中的正则
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # 计算机视觉入门
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (4)事件处理——(7)简单事件(Simple events)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (python)数据结构---字典
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)iOS字体
  • (转)Linux整合apache和tomcat构建Web服务器
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./configure、make、make install 命令
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net CoreRabbitMQ消息存储可靠机制
  • [《百万宝贝》观后]To be or not to be?
  • [Angular 基础] - 指令(directives)
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [cocos creator]EditBox,editing-return事件,清空输入框