题目描述
给定任意位数长度的两个数,求它们数值之和。
输入
每个测试用例含有两个数,代表两个任意位数长度的数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);
}
}