描述
给定任意位数长度的两个数,求它们数值之和。
输入
每个测试用例含有两个数,代表两个任意位数长度的数A,B.
输出
计算出这两个任意位数长度的数之和。
样例输入
123451234512345 543215432154321
12.345 54.321
12.345 54.321
样例输出
666666666666666
66.666
66.666
#include<iostream>
#include<cstring>
#define MIX 5000
#define M 4999
using namespace std;
int main()
{
int a[MIX],b[MIX],c[MIX],d[MIX];
char s1[MIX],s2[MIX];
while(cin>>s1>>s2)
{
if((strlen(s1)==1)&&(strlen(s2)==1)&&(s1[0]=='0')&&(s2[0]=='0')){cout<<0<<endl;continue;}
int i,j,k,l,flag=1;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
memset(c,0,sizeof(c));memset(d,0,sizeof(d));//初始化为零
l=strlen(s1);
for(i=0;i<l;i++)
if(s1[i]=='.')break;
k=0;
for(j=i-1;j>=0;j--)//用a数组存放小数点前面的数
a[k++]=s1[j]-'0';
j=0;
b[j++]=0;
if(i<l-1) //判断小数点后面是否有数,如果成立,则把小数点后面的数放入b数组
{
for(k=i+1;s1[k];k++)
b[j++]=s1[k]-'0';
}
l=strlen(s2);
for(i=0;s2[i];i++)
if(s2[i]=='.')break;
k=0;
for(j=i-1;j>=0;j--)//同上a数组
c[k++]=s2[j]-'0';
k=0;
d[k++]=0;
if(i<l-1)//同上b数组
{
for(j=i+1;s2[j];j++)
d[k++]=s2[j]-'0';
}
i=M;
for(j=0;j<i;j++)
{
a[j]=a[j]+c[j];
if(a[j]>9)a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
for(j=M;j>=1;j--)
{
b[j]=b[j]+d[j];
if(b[j]>9)b[j-1]+=(b[j]/10);
b[j]=b[j]%10;
}
a[0]+=b[0];
i=M;
for(j=0;j<i;j++)
{
if(a[j]>9)a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
i=M;
while(a[i]==0&&i>=0)i--;
while(i>=0)
{
cout<<a[i];
i--;
}
i=M;
while(b[i]==0&&i>0)i--;
if(i==0)
cout<<endl;
else
{
cout<<".";
j=1;
while(j<=i)
{
cout<<b[j];
j++;
}
cout<<endl;
}
}
return 0;
}