PAT-B1044.火星数字(菜菜的解答)

PAT-乙级 1044

问题描述

火星人是以 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

说明

开始没有太看明白这个题目。我就参考了柳神的代码自己敲了一下。今天就聊聊我没看明白的还有觉得比较重要的地方吧。

代码

转自:https://www.liuchuo.net/archives/581 柳神的Blog (吹一波 真心强呐)

#include <iostream>
#include <string>
using namespace std;

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"};
string s;
int len;
void func1(int t) {
	 if (t / 13) cout << b[t / 13];
	 if ((t / 13) && (t % 13)) cout << " ";
	 if (t % 13 || t == 0) cout << a[t % 13];
}
void func2() {
	 int t1 = 0, t2 = 0;
	 string s1 = s.substr(0, 3), s2;
	 if (len > 4) s2 = s.substr(4, 3); 
	 for (int i = 1; i <= 12; ++i)
	 {
	 	  if (s1 == a[i] || s2 == a[i]) t2 = i;
	 	  if (s1 == b[i]) t1 = i;
	 }
	 cout << t1 * 13 + t2;
}
int main() {
	int n;
	cin >> n;
	getchar();
	for (int i = 0; i < n; i++) {
	     getline(cin, s);
	     len = s.length();
	     if (s[0] >= '0' && s[0] <= '9')
	         func1(stoi(s));
	     else
	         func2();
	     cout << endl;
    }
	return 0;
}

菜菜的分析

  • 我没看明白的地方就是: ‘例如地球人的数字 29 翻译成火星文就是 hel mar 这句’。看的时候觉得,( ⊙ o ⊙ )啊?这是啥。后来看代码发现也就是高位和低位的问题。高位就是进位后的那个数组,低位就是1到12啦;(其实挺好理解的,我开始怀疑自己的智商了haha);
  • func1函数中t对13取余还有t除以13取商都是很好的办法。因为 t / 13不为0就说明它有高位,拿商做下标输出第一个高位数;之后第二个if加一个条件 % 13 不为0说明有低位,那么先输出空格,在第三个if中输出低位;第三个if中的 或 t == 0 是考虑没有高位的情况下直接输出低位的,此时前两个if都不满足;
  • func2函数用substr函数把输入的string的分成str1 和 str2(如果有的话,条件是len大于4),遍历一下找到它们对应的下标。低位 + 高位 * 13就算出来了;
  • main函数中就是在循环时判断一下是地球文还是火星文,然后调用对应的函数func1 或 func2即可;
  • 虽然柳神已经讲得很明白了自己还是啰嗦了半天拿自己的思路理了一次Ha~~。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值