九度1137解題報告

大神們說沒有更簡單的方法,於是還是用模擬加法。題目如下

http://ac.jobdu.com/problem.php?pid=1137

 

計算機裏的浮點數加法,是先對階,相加,然後規格化,類似地,在模擬的時候,我們也要對階,即將輸入的數分成小數部分和整數部分,然後相加,將結果輸出。我將輸入當做字符串處理,先超出兩個數的小數點的位置,然後將小數部分對齊,即在較短的小數部分後面補零,然後相加,記下進位,再將整數部分對齊,不齊的高位補零,然後相加,記得算上小數的進位,以及去掉小數部分的末尾零,最後輸出。代碼如下:

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

char s1[101],s2[101];
int  a[101],b[101],ans_d[101],ans_i[101];

int main()
{
    int n;
    scanf("%d",&n);
    while (n--)
    {
        scanf("%s %s",s1,s2);
        int alen=strlen(s1), blen=strlen(s2);
        int ap,bp;                                      
        for (int i=0;i<alen;++i)                       //求小數點的位置 
            if (s1[i]=='.') ap=i;
        for (int i=0;i<blen;++i)
            if (s2[i]=='.') bp=i;
        int ansp_len,asize=0,bsize=0;
        if (alen-ap>blen-bp)                           //將小數部分對齊 
        {
            ansp_len=alen-1-ap;
            for (int i=0;i<alen-ap-(blen-bp);++i)
                b[bsize++]=0;
        }
        else
        {
            ansp_len=blen-1-bp;
            for (int i=0;i<blen-bp-(alen-ap);++i)
                a[asize++]=0;
        }
        for (int i=alen-1;i>ap;--i)
            a[asize++]=s1[i]-'0';
        for (int i=blen-1;i>bp;--i)
            b[bsize++]=s2[i]-'0';                        
        int carry=0,temp;
        for (int i=0;i<ansp_len;++i)                    //小數部分相加 
        {
            temp=a[i]+b[i]+carry;
            ans_d[i]=temp%10;
            carry=temp/10;
        }
        int intlen;
        asize=bsize=0;
        for (int i=ap-1;i>=0;--i)                       //整數部分對齊 
            a[asize++]=s1[i]-'0';
        for (int i=bp-1;i>=0;--i)
            b[bsize++]=s2[i]-'0';
        if (ap>bp)
        {
            intlen=ap;
            for (int i=0;i<ap-bp;++i)
                b[bsize++]=0;
        }
        else
        {
            intlen=bp;
            for (int i=0;i<bp-ap;++i)
                a[asize++]=0;
        }
        for (int i=0;i<intlen;++i)                        //整數部分相加 
        {
            temp=a[i]+b[i]+carry;
            ans_i[i]=temp%10;
            carry=temp/10;
        }
        if (carry!=0) ans_i[intlen++]=carry;
        for (int i=intlen-1;i>=0;--i)
            printf("%d",ans_i[i]);
        printf(".");
        int end=0;
        while (ans_d[end]==0) ++end;                     //小數部分去尾零 
        for (int i=ansp_len-1;i>=end;--i)
            printf("%d",ans_d[i]);
        printf("\n");
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章