1. 程式人生 > >HDU 1753 大明A+B(大小數加法,C模擬,Java BigDecimal)

HDU 1753 大明A+B(大小數加法,C模擬,Java BigDecimal)

#include<stdio.h>
#include<string.h>
#define MAXN 500
char a[MAXN],b[MAXN];
int c[MAXN],d[MAXN],e[MAXN],f[MAXN],x[MAXN],y[MAXN];
int main()
{
    int i,j,k,m,p,q,len1,len2,t;
    while(scanf("%s%s",a,b)!=EOF)
    {
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        memset(e,0,sizeof(e));
        memset(f,0,sizeof(f));
//        memset(x,0,sizeof(x));
//        memset(y,0,sizeof(y));
        k=len1=strlen(a);
        for(i=0; i<len1; i++)
        {
            if(a[i]=='.')
                k=i;            //標記第一個字元的小數點的位置
        }
        m=len2=strlen(b);
        for(i=0; i<len2; i++)
        {
            if(b[i]=='.')
                m=i;            //標記第二個字元的小數點的位置
        }
        /**    **************將 整數轉換成數字 */
        for(j=0,i=k-1; i>=0; i--)
        {
            c[j++]=a[i]-'0';
        }
        for(j=0,i=m-1; i>=0; i--)
        {
            d[j++]=b[i]-'0';
        }
        //****************************將小數的字元轉換成數字
        for(j=0,i=k+1; i<len1; i++)
        {
            e[j++]=a[i]-'0';
        }
        for(j=0,i=m+1; i<len2; i++)
        {
            f[j++]=b[i]-'0';
        }
        //***************************算小數的部分
        p=q=0;
        if(len1-k<len2-m)
            p=len2-m;
        else
            p=len1-k;
        for(i=p-1; i>=0; i--)
        {
            x[i]=(e[i]+f[i]+q)%10;
            if(e[i]+f[i]+q>=10)
            {
                q=(e[i]+f[i]+q)/10;
            }
            else
                q=0;
        }
        //    *********************    算整數的部分
        if(k<m)
            t=m;
        else
            t=k;
        for(i=0; i<=t; i++)
        {
            y[i]=(c[i]+d[i]+q)%10;
            if(c[i]+d[i]+q>=10)
            {
                q=(c[i]+d[i]+q)/10;
            }
            else
                q=0;
        }
        if(y[t]>0)
            t=t+1;
        for(i=t-1; i>=0; i--)
            printf("%d",y[i]);
        /**************************************/
        while(x[p-1]==0)//消除小數後的0
        {
            if(x[p-1]==0)
                p=p-1;
        }


        /**************************************/
        if(p>0)
            printf(".");

        for(i=0; i<p; i++)
            printf("%d",x[i]);

        printf("\n");
    }
    return 0;
}
/*
1.1 2.9
1.1111111111 2.3444323343
1 1.1


4
3.4555434454
2.1
*/

Java AC程式碼: