带小数点的长高精度型相加
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
char a[500];
char b[500];
int c[500];
char xa[500];
char za[500];
char xb[500];
char zb[500];
char xc[500];
int temp=0;
int sun=0;
char k[10];
void solvexiao( char x[],char y[])
{
if(strlen(x)<strlen(y))
swap(x,y);
int lena=strlen(x)-1;
int lenb=strlen(y)-1;
int i,j;
for(i=lena;i!=lenb;i--)
{
xc[i]=x[i]-'0';
}
for(i;i>=0;i--)
xc[i]=x[i]-'0'+y[i]-'0';
int tep=0;
for(int i=lena;i>=1;i--)
{
xc[i-1]+=xc[i]/10;
xc[i]%=10;
}
if(xc[0]>=10)
{
temp=1;
xc[0]-=10;
}
for(int i=0;i<=lena;i++)
{
xc[i]+='0';
if(xc[i]!='0')
sun=1;
}
}
void solveda(char x[],char y[])
{
if(strlen(x)<strlen(y))
swap(x,y);
if(temp)
x[strlen(x)-1]++;
int lena=strlen(x)-1;
int lenb=strlen(y)-1;
int i,j;
for( i=lena,j=lenb;j>=0;i--,j--)
{
c[i]=x[i]-'0'+y[j]-'0';
}
for(i;i>=0;i--)
c[i]=x[i]-'0';
int tep=0;
for(int i=lena;i>=0;i--)
{
if(i!=0)
{
c[i-1]+=c[i]/10;
c[i]%=10;
}
}
for(int i=0;i<=lena;i++)
printf("%d",c[i]);
}
int main()
{
while(~scanf("%s%s",&a,&b))
{
memset(za,0,sizeof(za));
memset(zb,0,sizeof(zb));
memset(xa,0,sizeof(xa));
memset(xb,0,sizeof(xb));
memset(xc,0,sizeof(xc));
memset(c,0,sizeof(c));
memset(k,0,sizeof(k));
temp=0;
sun=0;
int flaga=0;
int cot=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]=='.')
{
flaga=i+1;
break;
}
za[cot++]=a[i];
}
cot=0;
for(int i =flaga;i<strlen(a);i++)
{
xa[cot++]=a[i];
}
int flagb=0;
cot=0;
for(int i=0;i<strlen(b);i++)
{
if(b[i]=='.')
{
flagb=i+1;
break;
}
zb[cot++]=b[i];
}
cot=0;
for(int i =flagb;i<strlen(b);i++)
{
xb[cot++]=b[i];
}
if(flaga!=0&&flagb!=0)
{
solvexiao(xa,xb);
}
else
{
if(flaga!=0&&flagb==0)
solvexiao(xa,k);
if(flaga==0&&flagb!=0)
{solvexiao(k,xb);
}
}
solveda(za,zb);
if(sun)
{
cout<<".";
int i;
for( i=strlen(xc)-1;i>=0;i--)
{
if(xc[i]!='0')
break;
}
for(int j=0;j<=i;j++)
cout<<xc[j];
}
cout<<endl;
}
return 0;
}