【PAT乙级】火星数字
题目描述:
火星人是以 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;
}
原文链接:【PAT乙级】火星数字
麦芽雪冷萃 版权所有,转载请注明出处。
还没有任何评论,你来说两句吧!