大数加法(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);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值