天天看點

ZOJ 1205 - Martian Addition 解題報告

          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”。

          完整代碼如下:

ZOJ 1205 - Martian Addition 解題報告
ZOJ 1205 - Martian Addition 解題報告

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;

繼續閱讀