【PAT乙级】火星数字

  • 2019 年 11 月 8 日
  • 筆記

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42449444/article/details/84920493

题目描述:

火星人是以 13 进制计数的:

  • 地球人的 0 被火星人称为 tret。
  • 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
  • 火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。

例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入描述:

输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。

输出描述:

对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:

4  29  5  elo nov  tam

输出样例:

hel mar  may  115  13

解题思路:

看完题目之后一脸懵逼,13进制转换,而且还要用火星文,它这个火星文搞起我有点想笑,不就是1~12不就是月份吗 哈哈哈哈 好吧 正经一点。先建立俩个字符串数组,一个数组a是0~13的火星文,另一个数组b是12个高位数字。然后用isdigit()这个函数判断输入的是地球数字还是火星文,这一步其实只需要看第一个字符是不是数字即可。若第一个字符是数字调用自定义函数earth2spark把地球数字转火星文,否则调用自定义函数spark2earth来把火星文转地球数字。地球数字转火星文时,需要先用一个atoi(s.c_str())来把字符串数字s转换成一个int型的数字,接着对这个数字进行判断,若小于13,直接调用数组a把它转换成火星文进行输出。因为题目已知输入的数字n小于100,所以当数字大于13时,直接将十位数转火星文进行输出,如果这个数还存在个位数的话就继续将个位数转火星文并输出。火星文转数字时,先判断这个火星文字符串s的长度是否大于3,若大于3说明这个火星数是高位数,在火星文字符串s中寻找子字符串,在a,b数组中找到对应的下标,通过这个下标来转换地球数字,第一个火星文单词转地球数字时要用下标乘以13再累加到sum,第二个火星单词找到对应下标后累加到sum就行了,此时sum的值就是高位火星文转地球数字后的值。若小于3说明这个火星数是个低位数,然后判断这个火星文是个位的还是十位的,在相应的字符串数组中找到下标累加到sum即可(同理,若火星文单词是十位)的就需要乘以13再累加),最后输出sum即可。

AC代码:

#include <bits/stdc++.h>  using namespace std;    void earth2spark(string s);    //地球数字转火星文  void spark2earth(string s);    //火星文转地球数字  string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct","nov", "dec"};  string b[13] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy","lok", "mer", "jou"};    int main()  {      int n;      cin >> n;      getchar();      for (int i = 0; i < n; i++)      {          string temp;          getline(cin,temp);          if(isdigit(temp[0]))  //若输入的temp是数字          {              earth2spark(temp);          }          else          {              spark2earth(temp);          }      }      return 0;  }    void earth2spark(string s)   //地球数字转火星文  {      int n = atoi(s.c_str());   //string型数字转int型数字      if(n < 13)   //若数字小于13      {          cout << a[n];      }      else   //若数字大于13      {          cout << b[n/13];  //输出转换后的十位数          if(n%13!=0)   //若有个位数          {              cout << " " << a[n%13];          }      }      cout << endl;  }    void spark2earth(string s)   //火星文转地球数字  {      int sum = 0;      if(s.length() > 3)      {          for (int i = 0; i < 13; i++)          {              if(s.substr(0,3) == b[i])    //第一个火星文单词,地球数字的十位              {                  sum += (i*13);              }              if(s.substr(4,7) == a[i])    //第二个火星文单词,地球数字的个位              {                  sum += i;              }          }      }      else      {          for (int i = 0; i < 13; i++)          {              if(s == a[i])   //若火星文单词是个位              {                  sum += i;                  break;              }              if(s == b[i])   //若火星文单词是十位              {                  sum += (i*13);                  break;              }          }      }      cout << sum << endl;  }