火星人是以 13 进制计数的: 分析:
题目要求输入数字转化为火星文,或者输入火星文转化为数字从输入样例中可以看出,输入数据类型与个数不可控,需要判断用空格判断输入数据个数,用第一个输入数据的类型来确定输入类型将火星文放在数组中,对应下标是它们对应的数字思路:
使用string来读取数据,%c读取第一个数据之后的空白符,确定是回车还是空格,再确定是否读取第二个数据若第一个数据是数字,将其从字符转化为数字,再对该数字求商和余; 若商为0(没有进位),直接输出余对应下标的字符串; 若商不为0,先输出商对应下标字符串,再输出余对应字符串,用空格隔开; 若商不为0而余为0,只输出商对应下标的字符串; 最后输出换行符若第一个数据非数字,通过%c确定是否读取第二个数据 若只有一个数据,说明无高位,直接输出其对应下标 若有两个数据,分别找出下标,转化为数字,输出代码如下
#include <iostream> #include <cmath> using namespace std; //s1 0到12, s2 进位后的0到12 string s1[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string s2[13] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; int main() { int N; scanf("%d", &N); for(int i = 0; i < N; i++) { string s3, s4; cin >> s3; char ch; scanf("%c", &ch); //读取输入字符串后的下一个字符,如果是空格,说明还有输入 int len3 = s3.size(); if(s3[0] >= '0' && s3[0] <= '9') { //输入的是数字 int sum = 0; for(int i = 0; i < len3; i++) sum += (s3[i]-'0') * pow(10, len3-1-i); if(sum <= 12) cout << s1[sum] << endl; else { int a = sum / 13, b = sum % 13; //a高位,b低位 //无高位,低位为零 if(a != 0 && b != 0) cout << s2[a] << ' ' << s1[b] << endl; //有高位有低位且低位为零 else if(a != 0 && b == 0) cout << s2[a] << endl; else cout << s1[b] << endl; //无高位,低位非零 } } else { //输入的是字符 if(ch == ' ') cin >> s4; int len4 = ch == ' '? s4.size() : 0; int a = 0, b = 0; //a 高位, b 低位 for(int i = 0; i < 13; i++) { if(len4 != 0) { //s4也有内容,所以s3是高位数字 if(s2[i] == s3) a = i; if(s1[i] == s4) b = i; } else { //s4无内容,不确定s3在哪一位 if(s1[i] == s3) b = i; if(s2[i] == s3) a = i; } } int sum = a * 13 + b; printf("%d\n", sum); } } }反馈:
题不难,不过细节处理真费时间字符串转数字的题也遇到好几次了,该去了解一下相关函数了