2014年7月10日 星期四

uva 10018 Reverse and Add

這題可以利用大數運算的加法來做,在做大數運算時,用來儲存的字串陣列,index 0 ,

從個位數開始存,這樣遇到進位的時候,可以很容易地往陣列的後面多一個數字。

這個儲存方法可以適用於加法、減法、乘法。

ex: 195 +9230

795 ->  597
9230 -> 0329

   597
 +0329
_______
   52001

從上面可以看到,位數直接對齊,增加的位數直接擺放到下一個位置。


這題用大數運算,所以一開始先把讀到的數字字串反轉。

相加的時候,再把數字字串複製的暫存陣列,把暫存陣列反轉,就可以相加了。

因為題目確定有最後會得到 palindrome,所以輸出時,直接輸出即可,不用再反轉。


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

int palindrome(char num[]){
    int i,j,ok;

    for(i=0,j=strlen(num)-1,ok=1;i<=(strlen(num)-1)/2;i++,j--){
        if(num[i]!=num[j]){
            ok=0; break;
        }
    }

    return ok;
}

void reverChar(char num[]){
    char tmp[20]={0};
    int i,j;

    strcpy(tmp,num);
    for(i=0,j=strlen(tmp)-1;j>=0;j--,i++){
        num[i]=tmp[j];
    }
    num[i]=0;

    return;
}

void add(char num1[], char num2[]){
    int i,carry=0,sum;

    for(i=0;i<=strlen(num1)-1;i++){
        sum=num1[i]-'0' + num2[i]-'0' + carry;
        if( sum > 9 ){ carry=1; sum%=10;}
        else carry=0;

        num1[i]=sum+'0';
    }
    if(carry==1)num1[i]=1+'0';
    num1[i+1]='\0';

    return;
}

int main(void){
    int amount,counter;
    char num1[20],num2[20];

    scanf("%d",&amount);
    while(1){
        amount--;

        scanf("%s",&num1);
        reverChar(num1);

        counter=0;
        while(1){
            if(palindrome(num1) == 1) break;
            ++counter;

            strcpy(num2,num1);
            reverChar(num2);
            add(num1,num2);
        }

        printf("%d %s\n",counter,num1);

        if(amount==0)break;
    }



    return 0;
}

沒有留言:

張貼留言