九度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;
}


 

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