PAT乙級 1044 火星數字
阿新 • • 發佈:2018-11-19
火星人是以 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
思路:
首先,由於輸入的火星文是包含空格的字串,因此我們需要想辦法把每個數字提取出來,這裡用到了函式sscanf(),這裡是關於該函式用法的詳細介紹:https://blog.csdn.net/gzshun/article/details/7081736 。
程式碼:
#include<stdio.h> #include<string.h> int main(){ char Zero[5]="tret"; char Earth[12][4]={"jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}; char Mars[12][4]={"tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"}; int N; char number[100][12],buf1[4],buf2[4]; scanf("%d",&N); getchar();//接收scanf()回車遺留字元 for(int i=0;i<N;i++){ gets(number[i]); } for(int i=0;i<N;++i){ int temp,len; if(number[i][0]>='0'&&number[i][0]<='9'){//地球文 sscanf(number[i],"%d",&temp); if(temp>=13){ if(temp%13==0){ printf("%s",Mars[temp/13-1]); } else printf("%s %s",Mars[temp/13-1],Earth[temp%13-1]); } else{ if(temp==0){ printf("%s",Zero); } else printf("%s",Earth[temp-1]); } } else{//火星文 int j; len=strlen(number[i]); if(len<6){ sscanf(number[i],"%s",buf1); if(!strcmp(Zero,buf1)){ temp=0; } else { for(j=0;strcmp(buf1,Earth[j])!=0;++j); temp=j+1; } printf("%d",temp); } else{ sscanf(number[i],"%s %s",buf1,buf2); for(j=0;strcmp(buf1,Mars[j])!=0;++j); temp=13*(j+1); if(strcmp(Zero,buf2)!=0){ for(j=0;strcmp(buf2,Earth[j])!=0;++j); temp=temp+j+1; } printf("%d",temp); } } if(i!=N-1){ printf("\n"); } } return 0; }
第一次修改:
之前忽略了一個問題,即火星文為一位時,可能是進位了的也可能是未進位的。
#include<stdio.h> #include<string.h> int main(){ char Zero[5]="tret"; char Earth[12][4]={"jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}; char Mars[12][4]={"tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"}; int N; char number[100][12],buf1[4],buf2[4]; scanf("%d",&N); getchar();//接收scanf()回車遺留字元 for(int i=0;i<N;i++){ gets(number[i]); } for(int i=0;i<N;++i){ int temp,len; if(number[i][0]>='0'&&number[i][0]<='9'){//地球文 sscanf(number[i],"%d",&temp); if(temp>=13){//會產生進位的地球文 if(temp%13==0){ printf("%s",Mars[temp/13-1]); } else printf("%s %s",Mars[temp/13-1],Earth[temp%13-1]); } else{//不會產生進位的地球文 if(temp==0){ printf("%s",Zero); } else printf("%s",Earth[temp-1]); } } else{//火星文 int j; len=strlen(number[i]); if(len<6){//只有一位火星文 sscanf(number[i],"%s",buf1); if(!strcmp(Zero,buf1)){ temp=0; } else { for(j=0;j<12;++j){ if(strcmp(Earth[j],buf1)==0){//未進位 temp=j+1; break; } if(strcmp(Mars[j],buf1)==0){//有進位 temp=13*(j+1); break; } } } printf("%d",temp); } else{//有兩位火星文 sscanf(number[i],"%s %s",buf1,buf2); for(j=0;strcmp(buf1,Mars[j])!=0;++j); temp=13*(j+1); if(strcmp(Zero,buf2)!=0){ for(j=0;strcmp(buf2,Earth[j])!=0;++j); temp=temp+j+1; } printf("%d",temp); } } if(i!=N-1){ printf("\n"); } } return 0; }