1044 火星数字 (20分)
作者:互联网
1044 火星数字 (20分)
火星人是以 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
代码讲解:这题要注意的细节是很多的,我是用c写的,第一你首先要想到,怎么去判别
我输入的是中文还是地球文,当然你可以使用字符数组,然后去慢慢去判别,然后再去
看是一位,还是俩位,这也太麻烦了,这写完得多少行代码才行啊,要利用scanf的返回值
去判断中文和地球文,判别之后还是要注意,它可能是一位的火星文,也可以是俩位的火星文
一定要注意,即便一位的火星文,也不一定就是低位的,因为高位火星文低位是零的情况下,
是不输入的,你注意看最后一个tam那个范例你就懂了。。。。所以情况你都要分清。。。
#include<stdio.h>
#include<string.h>
int main()
{
char di[][5]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
char gao[][5]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int k;
scanf("%d",&k);
int e;
char a[20];
int flag; //判断是中文还是火星文的
int i,j;
int sum;
while(k--)
{
sum=0;
flag=scanf("%d",&e);
if(flag==0)
{
gets(a);
for(i=0;a[i]!=' '&&a[i]!='\0';i++); //判断是一位火星文,还是俩位的火星文
if(a[i]==0) //是否是一位的火星文
{
for(i=0;i<13;i++) //看一位的火星文是否是低位火星文。。
{
if(strcmp(a,di[i])==0)
break;
}
if(i!=13) //确定是否是低位火星文,是的话直接输出
printf("%d\n",i);
else //只有一位,但是高位火星文
{
for(j=0;j<13;j++)
{
if(strcmp(a,gao[j])==0)
break;
}
printf("%d\n",j*13) ;
}
}
else //俩位火星文的情况
{
a[i]='\0';
for(j=0;j<13;j++) //高位的情况
{
if(strcmp(a,gao[j])==0)
break;
}
sum+=j*13; //把高位的算出来
i++;
while(a[i]==' ')i++; //俩位之间不应只有一个空格,把中间的空格都去掉,防止误判
for(j=0;j<13;j++) //找到低位的对应数字
{
if(strcmp(a+i,di[j])==0)
break;
}
sum+=j; //把他相加
printf("%d\n",sum); //结束
}
}
else //输入的中文,求火星文
{
if(e/13!=0) //是否有高位
{
if(e%13!=0) //低位不为为0
printf("%s %s\n",gao[e/13],di[e%13]);
else //低位为0不需要输出低位了
{
printf("%s\n",gao[e/13]);
}
}
else //没有高位只有低位的时候。
printf("%s\n",di[e%13]);
}
}
return 0;
}
标签:13,20,1044,int,di,gao,printf,火星 来源: https://www.cnblogs.com/bigageyuan/p/13914873.html