高精度小数加算


高精度小数加算
ラベル(スペース区切り):アルゴリズムコンテストの高精度
原題はHDU 1753.当時はこのような問題が高精度演算とは知らず、大数の演算だと思っていたので、大数の四則演算を「大数家族桶」と名付けて、今考えても楽しかったです.
ネット上でこの問題がJavaで書くことを見て、分を分けて問題に署名して、みんなは見てみることができて、私のここは書いていません.
    Problem Description
      ,          ,         ,          “  ”。
                100       “  ” ,                 。

      ,        A B,            A+B  。


    Input
               ,        。
                         400    A B。


    Output
              A+B  ,       。      Sample Output。


    Sample Input
    1.1 2.9
    1.1111111111 2.3444323343
    1 1.1


    Sample Output
    4
    3.4555434454
    2.1

明らかに高位小数加算で、doubleではできません.それはシミュレーション配列の加算しかできません.次は私が書いた答えです.小数点以下の小数点と整数点を分離したコードを関数に書こうとすると、プログラムのコミットは常に過ぎず、やむを得ず、同じ関数に書きます.正解は以下の通りです.
#include 
#include 
#define N 401
int a[N]={0},b[N]={0},c[N]={0},d[N]={0};
int main()
{
    char str1[N],str2[N];
    while (scanf("%s %s",str1,str2)!=EOF)
    {
        int i,j,k;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        int len1=strlen(str1),len2=strlen(str2);
        for (i=0;str1[i]!='.'&&i0;
        for (j=i+1;j//         
            a[k++]=str1[j]-'0';
        k=0;
        for (j=i-1;j>=0;j--)        //         
            b[k++]=str1[j]-'0';
        k=0; 
        for (i=0;str2[i]!='.'&&ifor (j=i+1;j//         
            c[k++]=str2[j]-'0';
        k=0;
        for (j=i-1;j>=0;j--)        //         
            d[k++]=str2[j]-'0';
        k=0;
        for (i=N;i>=0;i--)      //       
        {
            a[i]+=c[i];
            if (i!=0&&a[i]>9)
            {
                a[i]%=10;
                a[i-1]++;
            }
            else if (i==0&&a[i]>9)
            {
                a[i]%=10;
                b[0]++;
            }
        }
        for (i=0;i//         
        {
            b[i]+=d[i];
            if (b[i]>9)
            {
                b[i]%=10;
                b[i+1]++;
            }
        }
        for (i=N;i>=0&&b[i]==0;i--); //       
        for (j=i;j>=0;j--)
            printf("%d",b[j]);
        for (i=N;i>=0&&a[i]==0;i--);    //       
        if (i>=0)
        {
            printf(".");
            for (j=0;j<=i;j++)
            {
                printf("%d",a[j]); 
            }   
        }
        printf("
"
); } return 0; }

私がネット上で探しているC言語の実現コードはすべてとても長くて、百行を過ぎて、私が書いたこの最短だと思っています.また、私が書いた関数を設定するコードもあります.なぜ間違っているのか分かりませんが、貼ってください.
#include 
#include 
#define N 401

int f=0;
int a[N],b[N],c[N],d[N];

void store(char str[N],int decimal[N],int integer[N])
{
    int i,j,k=0;
    int len = strlen(str);
    for (i=0;iif (str[i]=='.')
        {
            f=1;
            break;
        }       
    }
    for (j=i+1;j'0';
    k=0;
    for (j=i-1;j>=0;j--)
        integer[k++]=str[j]-'0';
}

int main()
{
    char str1[N],str2[N];
    while (scanf("%s%s",str1,str2)!=EOF)
    {
        memset(a,0,N);
        memset(b,0,N);
        memset(c,0,N);
        memset(d,0,N);
        store(str1,a,b);
        store(str2,c,d);
        int i,j=0;
        for (i=N;i>=0;i--)
        {
            a[i]+=c[i];
            if (i!=0&&a[i]>=10)
            {
                a[i]-=10;
                a[i-1]++;
            }
            if (i==0&&a[i]>=10)
            {
                a[i]-=10;
                b[0]++;
            }
        }
        for (i=0;iif (b[i]<=0)
            {
                break;
            }
            else if (b[i]>=10)
            {
                b[i]-=10;
                b[i+1]++;
            }   
        }
        for (i=N;i>=0;i--)
        {
            if (b[i]!=0)
                j=1;
            if (j)
                printf("%d",b[i]);
        }
        if (!j)
            printf("0");
        for (i=N;i>=0;i--)
            if (a[i])
                break;
        if (i>-1)
            printf(".");
        if (i>=0)
            for (j=0;j<=i;j++)
                printf("%d",a[j]);
        printf("
"
); } return 0; }

上记のコードの运行は问题ありませんが、提出するとWAになります.私もなぜか分かりません.