2014年7月23日 星期三

uva 424 Integer Inquiry

實做加法的大數運算:

如果直接把讀到的數字做加法,需要考慮位數對應和擴增陣列大小的問題。

把所有讀到的數字反向,再做加法 => 位數直接對應,擴增大小只要往後面加數字即可。

輸出結果時,再反向回來即可。

注意:

1. 如果用 fgets 讀,會有 '\n',改用 scanf("%s") 可以避免這個問題。

2.  當新加的數字位數比目前的 sum 多,或是兩個數字相加後,超過目前的位數時,需要對

    sum 擴增,因為 sum 擴增的那一位的值 0,跟原本兩個字元做相加的運算不同,所以要寫

   判斷式處理。

   ex :

   num[10]={0};

   假設現在 num 讀到 956 (第一個數字)

   下一個數字為 956

      659
    +659
________
      2191
            ↑ 在 num 裡原本的值是 0,如果依照前面字元 num[i]+= '9' - '0' + carry 的方法處理,

               在 if( num[i] > '9' ) 判斷進位的地方會有問題,所以遇到原本的值為 0 時,直接把値

               存進去 num[i] = carry + '0'
       6
     +05
________
       65
         ↑ 這個情況也是,原本的值是 0,直接把直存進去 num[i] = num_tmp[i] + carry



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverNum(char number[]){
    char tmp[150]={0};
    int i,j;

    for(i=strlen(number)-1,j=0;i>=0;i--,j++){
        tmp[j]=number[i];
    }
    tmp[j]='\0';

    for(i=0;tmp[i]!='\0';i++){
        number[i]=tmp[i];
    }

    return;
}

int main(void){
    char number[150]={0},number_tmp[150]={0},carry;
    int i,top;

    top=-1;

    fgets(number,150-1,stdin);
    number[strlen(number)-1]='\0';
    reverNum(number);

    while( fgets(number_tmp,150-1,stdin)!=NULL ){
        if( strlen(number_tmp)==2 && number_tmp[0]=='0' ){
            break;
        }
        number_tmp[strlen(number_tmp)-1]='\0';
        reverNum(number_tmp);

        carry=0;
        for(i=0;number_tmp[i]!='\0';i++){
            if(number[i]==0){
                number[i] = number_tmp[i] + carry;
            }else{
                number[i] += (number_tmp[i]-'0') + carry;
            }

            if(number[i] > '9'){
                carry=(number[i]-'0')/10;
                number[i] = ( (number[i]-'0') % 10 ) + '0';
            }else{
                carry=0;
            }
        }

        while(carry!=0){
            if(number[i]==0){
                number[i]=carry+'0';
            }else{
                number[i]+=carry;
            }

            if(number[i] > '9'){
                carry=(number[i]-'0')/10;
                number[i] = ( (number[i]-'0') % 10 ) + '0';
            }else{
                carry=0;
            }

            ++i;
        }
    }

    reverNum(number);

    printf("%s\n",number);

    return 0;
}

沒有留言:

張貼留言