结构体法,整整齐齐的
#include<iostream>
#include<string>
#include<cstring>
int CF=0; //小数->整数进位标志
using namespace std;
struct number{ //数字结构体,整数和小数长度看似没必要但还是有点用的
string all; //每个数字的全部字符
string zheng; //整数部分
string xiao; //小数部分
int zhenglen; //整数长度
int xiaolen; //小数长度
int pos; //小数点位置
};
string zplus(string a,string b){ //整数部分相加
int cf=0; //整数部分进位标志
for(int i=a.length()-1;i>=0;i--){ //从低位逐位相加,注意进位标志CF、cf
if((a[i]-'0')+(b[i]-'0')+cf+CF>=10){
a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+CF-10+'0');
cf=1;
}
else if((a[i]-'0')+(b[i]-'0')+cf<10){
a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+CF+'0');
cf=0;
}
if(i==a.length()-1) CF=0; //最低位相加后,就不用考虑小数整数进位
}
if(cf==1) a.insert(0,"1"); //最高位相加后,若还有进位
return a;
}
string xplus(string a,string b){ //小数部分相加,基本相同
int cf=0;
for(int i=a.length()-1;i>=0;i--){
if((a[i]-'0')+(b[i]-'0')+cf>=10){
a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf-10+'0');
cf=1;
}
else if((a[i]-'0')+(b[i]-'0')+cf<10){
a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+'0');
cf=0;
}
}
if(cf==1) CF=1; //如果十分位相加后有进位
return a;
}
int main(){
number a,b,test; //test方便每一组数据结束后清空a和b
while(getline(cin,a.all)){
getline(cin,b.all);
a.pos=a.all.find('.'); //下面一长串都是初始化a和b
b.pos=b.all.find('.');
a.zheng.insert(0,a.all.substr(0,a.pos));
b.zheng.insert(0,b.all.substr(0,b.pos));
a.xiao.insert(0,a.all.substr(a.pos+1));
b.xiao.insert(0,b.all.substr(b.pos+1));
a.zhenglen=a.zheng.length();
b.zhenglen=b.zheng.length();
a.xiaolen=a.xiao.length();
b.xiaolen=b.xiao.length();
if(a.zhenglen<b.zhenglen){ //a整数比b整数短,则,否则同理
for(int i=0;i<b.zhenglen-a.zhenglen;i++){
a.zheng.insert(0,"0");
}
}
else if(a.zhenglen>b.zhenglen){
for(int i=0;i<a.zhenglen-b.zhenglen;i++){
b.zheng.insert(0,"0");
}
}
if(a.xiaolen<b.xiaolen){ //小数同理
for(int i=0;i<b.xiaolen-a.xiaolen;i++){
a.xiao.insert(a.xiao.length(),"0");
}
}
else if(a.xiaolen>b.xiaolen){
for(int i=0;i<a.xiaolen-b.xiaolen;i++){
b.xiao.insert(b.xiao.length(),"0");
}
}
string p2=xplus(a.xiao,b.xiao); //分别计算小数和整数并输出
string p1=zplus(a.zheng,b.zheng);
cout<<p1<<'.'<<p2<<endl;
a=test; //清空a和b
b=test;
}
return 0;
}