【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; }