1. 程式人生 > >大數加法(JSU-ZJJ)

大數加法(JSU-ZJJ)

題目描述

給定任意位數長度的兩個數,求它們數值之和。

輸入

每個測試用例含有兩個數,代表兩個任意位數長度的數A,B.

輸出

計算出這兩個任意位數長度的數之和。

樣例輸入

123451234512345 543215432154321
12.345 54.321

樣例輸出

666666666666666
66.666

分析:

此題,相比於之前的大數而言,多了小數。其實在也不過是簡單大數的加強版吧。在本題中,我卡了。第一,是因為陣列一開始只開了1000大小,導致一直執行錯誤。第二,是沒有考慮特殊情況。1.99+0.01=2;我一開始以為是要輸出2.00;但是很明顯不是這樣的。是隻輸出一個2。就行了
對於本題我的基本思路是。先對齊,按小數點的那個位置對齊。這樣的話,個位百位就會一一對應。如果沒有小數點的話,也是可以直接按末尾對齊,以達到個位百位一一對應的情況。然後直接從最後開始依次相加至第三個陣列。

#include"stdio.h"
#include"string.h"
//定位至小數點,如果沒有小數點則定位至末尾
int GPS(char digit[10000])
{
    int i,l;
    l=strlen(digit);
    for(i=0;i<l;i++)
        if(digit[i]=='.')
           break;
    return i;
}
//按照GPS函式返回的小數點的位置,將個位百位對齊。
void Corresponding(char *digitA,int pointA,char *digitB,int pointB)
{   char transfer[10000];
    int i;
    if(pointA!=pointB)
    {
        if(pointA>pointB)
        {
            strcpy(transfer,digitB);
            strcpy(digitB+(pointA-pointB),transfer);
            for(i=0;i<pointA-pointB;i++)
                digitB[i]='0';
          //  puts(digitA);
          //  puts(digitB);
        }
        else
        {
            strcpy(transfer,digitA);
            strcpy(digitA+(pointB-pointA),transfer);
            for(i=0;i<pointB-pointA;i++)
                digitA[i]='0';
           // puts(digitA);
          // puts(digitB);
        }
    }

}
//相加函式
void ADD(char digitA[10000],int pointA,int leghtA,char digitB[10000],int pointB,int leghtB,char digitC[10001])
{  int mark=0,pre,leghtC,point,M,j;
   digitC[leghtA+1]='\0';
   digitC[leghtB+1]='\0';
   if(leghtA>leghtB)
      leghtC=leghtA+1;
   else
      leghtC=leghtB+1;
    point=leghtC;
   while(leghtA>leghtB)
   {
       digitC[leghtA]=digitA[leghtA-1];
       leghtA--;
   }
   while(leghtB>leghtA)
   {
       digitC[leghtB]=digitB[leghtB-1];
       leghtB--;
   }

   while(leghtB>0)
   {   if(digitA[leghtB-1]=='.')
           {   point=leghtB-1;
               digitC[leghtB]='.';
               leghtB--;continue;
           }
       if(digitA[leghtB-1]-'0'+digitB[leghtB-1]-'0'+mark>9)
              pre=1;
       else
              pre=0;
       digitC[leghtB]=(digitA[leghtB-1]-'0'+digitB[leghtB-1]-'0'+mark)%10+'0';
       mark=pre;
       leghtB--;
   }

   if(mark==1)
      {digitC[0]='1';
      }
    else
        digitC[0]='-1';
    leghtC=strlen(digitC);
    point=0;
    //判斷2.00的特殊情況。
    while(digitC[point]!='\0'&&point<leghtC)
        if(digitC[point]=='.')
            break;
        else
            point++;
    M=0;j=point;
    while(point<leghtC)
    {
        if(digitC[point]>='1'&&digitC[point]<='9')
            M=1;
        point++;
    }
    if(M==0)
        digitC[j]='\0';
   if(mark==0)
       printf("%s\n",(digitC+1));
   else
      printf("%s\n",(digitC));
}
int main()
{
    char digitA[10000],digitB[10000],digitC[10001];
    int leghtA,leghtB,pointA,pointB,POINT;
    int i,j,k;
    while(~scanf("%s%s",digitA,digitB))
    {
        pointA=GPS(digitA);
        pointB=GPS(digitB);
        Corresponding(digitA,pointA,digitB,pointB);
        //puts(digitA);
        //puts(digitB);
        POINT=GPS(digitA);
        pointA=POINT;
        pointB=POINT;
        leghtA=strlen(digitA);
        leghtB=strlen(digitB);
        ADD(digitA,pointA,leghtA,digitB,pointB,leghtB,digitC);

    }
}