题目是这样的:
火星人是以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
题目比较简单,建立字符串和数字的对应关系一一查找替换即可,稍微有点麻烦的是字符串知识薄弱,不知道一整个字符串的一部分如何拿来和别的字符串进行比较。这个题目比较简单,字符串内肯定不会分隔成超过两个字符串,于是在中间空格部位加了
'\0',把前面当做一个字符串,后面的存在另一个新建的字符串里,再利用strcmp函数进行比较。代码如下:
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; const int maxn=200; char str[maxn][maxn]; int main(){ char G[13][maxn]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}; char S[13][maxn]={"OK","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"}; int N; scanf("%d",&N); getchar(); for(int i=0;i<N;i++){ gets(str[i]); } for(int i=0;i<N;i++){ int len=strlen(str[i]); if(str[i][0]>='0'&&str[i][0]<='9'){ int ans1=0,carry=1,first,second; for(int j=len-1;j>=0;j--){ ans1+=carry*(str[i][j]-'0'); carry*=10; } first=ans1/13; second=ans1%13; if(ans1<=12){ printf("%s\n",G[second]); }else{ if(second==0){ printf("%s\n",S[first]); }else printf("%s %s\n",S[first],G[second]); } }else{ if(len<=4){ for(int j=0;j<13;j++){ if(strcmp(G[j],str[i])==0){ printf("%d\n",j); break; } if(strcmp(S[j],str[i])==0){ printf("%d\n",j*13); } } }else{ int ans2=0; char temp[10]; for(int j=4;j<len;j++){ temp[j-4]=str[i][j]; } temp[3]='\0'; str[i][3]='\0'; for(int j=0;j<13;j++){ if(strcmp(S[j],str[i])==0){ ans2+=j*13; break; } } for(int j=0;j<13;j++){ if(strcmp(G[j],temp)==0){ ans2+=j; break; } } printf("%d\n",ans2); } } } return 0; }
还有一点需要注意的:利用循环输入字符串的之前输入了循环次数N,然后敲了回车键,这样第一个gets()就保存了这个换行符,所以少一个循环。正确的做法是在循环之前写一行getchar(),保存那个换行符。
百度了另外两个代码,分别用字符数组和string来写的。
利用字符数组来写的代码地址:http://blog.youkuaiyun.com/chr1991/article/details/50726405。
和我的代码差不多,不同之处在于:
第一、isdigit(字符)判断是否为数字,如果是,返回1,否则返回0,使用的时候要加上头文件#include<ctype.h>。 第二、对于字符串内部某一段和另外一个字符串是否一样,使用了strstr函数。strstr函数的简单用法是:strstr(str1,str2),返回字符串str2在字符串str1中第一次出现的位置指针,如果找不到,返回NULL。
利用string来写的代码地址:
http://blog.youkuaiyun.com/wanmeiwushang/article/details/51502126
使用string的输入方法:getline(cin,str变量名),可以输入一整行,若利用getline输入字符数组一整行,方法为cin.getline(str变量名,数字),数字至少比str变量长度大1。之后对于可能的用空格分开的两个string,新建一个string,初始化为空格,然后加上每个需要的字符就可以了,再之后string的比较就很简单了。
不知道关于字符串内部比较还有没有新的方法,目前就先学习到这吧。