1. 程式人生 > 實用技巧 >1044 火星數字 (20分)

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;
}