//支持整形和浮点数,输入参数为以'/0'结尾的字符内存块首地址,返回指向某个内存块的指针
#include<iostream>
using namespace std;
char*intger_add(char*A,char*B);
char*float_add(char*A,char*B);
void main(){
/*
memset(a,1,12);
memset(b,1,12);
;*/
char bufa[250];
char bufb[250];
(cin.get(bufa,250)).get();
char strA[]=bufa;
cin.get(bufb,250);
char strB[]=bufb;
cout<<float_add(strA,strB)<<endl;
}
//************************************
// Method: big_add
// FullName: big_add
// Access: public
// Returns: char* 结果字符串的指针地址
// Qualifier:
// Parameter: char * A 以'/0'结尾数字字符串指针
// Parameter: char * B 以'/0'结尾数字字符串指针
//************************************
char*intger_add(char*A,char*B){
int lenA=strlen(A);
int lenB=strlen(B);
char*src,*opt;
(lenA>lenB)?(src=A,opt=B):(src=B,opt=A);
int MaxLength=((lenA>lenB)?lenA:lenB)+2;
char*rs=new char[MaxLength];
rs[MaxLength-1]='/0';
rs[0]='0';
memccpy(rs+1,src,'/0',strlen(src)); //将较长字符串作为被操作数,并预留一位以备进位使用
const int lPosS=MaxLength-2; //被操作字符串个位数字位置
const int lPosT=strlen(opt)-1; //操作字符串个位数字位置
int of=0,k=lPosS,temp;
for(int j=lPosT;j>=0&&k>=0;j--,k--){
temp=int(opt[j])+(int)rs[k]-2*int('0')+of; //temp=被操作数+操作数+进位
if(temp>9)
{
rs[k]=temp-10+'0';
of=1;
}
else{
rs[k]=temp+'0';
of=0;
}
}
while(k>=0){
temp=(int)rs[k]+of-(int)'0';
if(temp>9){
rs[k]=temp+'0'-10;
of=1;
}
else{
of=0;
rs[k]=temp+'0';
}
k--;
}
return (rs[0]=='0')?(rs+1):rs;
}
char*float_add(char*A,char*B){
char*AI="",*AF="",*BI="",*BF="";
for(int i=0;i<strlen(A);i++)
{
if('.'==A[i])
if(i==0)
AF=A+1;
else{
AF=A+i+1;
AI=A;
A[i]='/0';
}
}
for(int i=0;i<strlen(B);i++)
{
if('.'==B[i])
if(i==0)
BF=B+1;
else{
BF=B+i+1;
BI=B;
B[i]='/0';
}
}
char*lp,*sp;
(strlen(AF)>strlen(BF))?(lp=AF,sp=BF):(lp=BF,sp=AF);
char*p=new char[strlen(lp)+1];
p[strlen(lp)]='/0';
memset(p,'0',strlen(lp));
memccpy(p,sp,'/0',strlen(sp));
char*part2=intger_add(p,lp);
char off[2];
if(strlen(part2)>strlen(p))
{
part2=part2+1;
off[0]='1';
off[1]='/0';
}
else
{
off[0]=off[1]='/0';
}
char*temp=intger_add(AI,BI);
char*part1=intger_add(temp,off);
char*rs=new char[strlen(part1)+strlen(part2)+2];
rs[strlen(part1)+strlen(part2)+1]='/0';
memccpy(rs,part1,'/0',strlen(part1));
rs[strlen(part1)]='.';
memccpy(rs+strlen(part1)+1,part2,'/0',strlen(part2));
delete[] p;
p=NULL;
return rs;
}