http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1205
題目說明:(把題目從GOOGLE翻譯的結果修改而來)
在22世紀,科學家們發現智能居民生活在火星。火星人非常喜歡數學。每一年,他們将舉行一次火星算術大賽(計算機) ,競賽内容是計算兩個100位數的和,使用時間最少的人獲得冠軍。今年,他們還邀請地球上的人參加競賽。
作為唯一代表地球,你發送給火星以展示人類的力量。幸運的是你帶去的的筆記本電腦可以幫助您快速完成工作。現在剩下的問題隻是寫一個小程式來計算的兩個給定數字的和。然而,在你開始寫程式前要注意的是,火星人使用20進制數,因為它們通常有20個手指。
輸入:
給定一些火星數,每個一行。火星數是由0到9 ,和小寫字母 a 至 j 組成的(小寫字母a開始分别代表10 , 11 , ... , 19 )。所有給定數字的位數不會超過100 。
輸出:
對于每一對數字,在一行中輸出它們的和。
樣本輸入:
1234567890
abcdefghij
99999jjjjj
9999900001
示例輸出:
bdfi02467j
iiiij00000
=================================================
此題也是一道簡單題目,和前一篇文章中的題目非常類似,過程是:
(1)解析輸入的一行字元串,并儲存到一個char[]中。由于輸入時從最高位寫到個位,而數組中從個位到高位。是以這是一個類似于把字元串逆轉的過程。同時,還要把字元轉換為相應的實際數值。
(2)按照加法的法則進行計算。
(3)輸出結果。這一步必須注意一些比較特殊的情況。例如如果輸入是兩個0,必須能列印出“0”。
完整代碼如下:

Code - 1205
/* ZOJ - 1205 , 20進制數想加 */
#include <stdio.h>
#include <string.h>
char* NUMS="0123456789abcdefghij";
/*分别是讀取的輸入行,加數a,b,計算結果c */
char line[105],a[105],b[105],c[105];
/*字元換算為實際數值,例如'a'->10,'b'->11*/
int CharToVal(char c)
{
return strchr(NUMS, c)-NUMS;
}
/*解析輸入*/
void CopyNum(char* dest, const char* line)
int i,len=strlen(line);
for(i=0;i<len;i++)
{
dest[i]=CharToVal(line[len-1-i]);
}
/*列印加法結果,注意結尾如果為0也要列印0*/
void PrintResult()
int i=101;
while(c[i]==0) i--;
if(i<0) i=0; /*非常重要,可以保證至少要列印一個0。*/
for(;i>=0;i--)
printf("%c", NUMS[c[i]]);
printf("\n");
/*做加法: c=a+b; */
void Add()
int i;
int k=0,sum;/*進位的數值*/
for(i=0;i<102;i++)
sum = a[i] + b[i] + k;
c[i] = sum%20;
k = sum/20;
int main()
while(scanf("%s",line)!=EOF && strcmp(line,"END")!=0)
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
CopyNum(a,line); /*擷取加數A*/
scanf("%s",line);
CopyNum(b,line); /*擷取加數B*/
Add(); /*C=A+B;*/
PrintResult(); /*列印出結果*/
return 0;