#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct bigNum{
int left[1000];
int right[1000];
int size1;
int size2;
void init(){
for(int i=0;i<1000;++i){
left[i]=0;
right[i]=0;
}
size1=0;
size2=0;
}
void setX(char *str){
init();
int len=strlen(str);
int nn=1;
//找到小数点位置pi
int pi=0;
for(;pi<len&&str[pi]!='.';++pi){
}
//整数部分
int c=1;
for(int i=pi-1;i>=0;--i){
left[size1] += (str[i]-'0')*c;
if(c==1000){
c=1;
size1++;
}
else{
c=c*10;
}
}
if(c!=1){
size1++;
}
//小数部分
c=1000;
for(int i=pi+1;i<len;++i){
right[size2] = right[size2]+(str[i]-'0')*c;
if(c==1){
c=1000;
size2++;
}
else{
c=c/10;
}
}
if(c!=1000){
size2++;
}
}
bigNum operator + (const bigNum &A)const{
bigNum ret;
ret.init();
int size=max(size2,A.size2);
//cout<<"size: "<<size<<endl;
int c=0;
for(int i=size-1;i>=0;--i){
int tmp=right[i]+A.right[i]+c;
c=tmp/10000;
tmp=tmp%10000;
ret.right[i]=tmp;
//cout<<"ret right: "<<ret.right[i]<<endl;
}
for(int i=0;i<size1||i<A.size1;++i){
int tmp=left[i]+A.left[i]+c;
c=tmp/10000;
tmp=tmp%10000;
ret.left[ret.size1++]=tmp;
}
if(c!=0){
ret.left[ret.size1++]=c;
}
bool flag=false;
for(int i=0;i<size;++i){
if(ret.right[i]!=0){
flag=true;
ret.size2=i;
}
}
if(flag){
ret.size2++;
}
else{
ret.size2=0;
}
return ret;
}
void output(){
for(int i=size1-1;i>=0;--i){
if(i==size1-1){
printf("%d",left[i]);
}
else{
printf("%04d",left[i]);
}
}
if(size2!=0){
cout<<".";
for(int i=0;i<size2-1;++i){
printf("%04d",right[i]);
}
int tmp=right[size2-1];
int x=4;
while(tmp%10==0){
tmp=tmp/10;
x--;
}
printf("%0*d",x,tmp);
}
printf("\n");
}
};
int main(){
char str1[2000];
char str2[2000];
while(cin>>str1>>str2){
bigNum num1,num2;
num1.setX(str1);
num2.setX(str2);
num1=num1+num2;
num1.output();
}
return 0;
}
09-03
4578
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-07
763
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
12-12