- 先将长短可能不一的两数对齐(补零);
- 然后利用串行进位加法器的方法,由低位到高位逐位计算,先算小数部分再算整数部分
#include <iostream>
#include <algorithm>
using namespace std;
void alignInt(string &str,int n){
if(str.length()==n) return;
for(int i=n-str.length();i>0;i--) str='0'+str;
}
void alignDec(string &str,int n){
if(str.length()==n) return;
for(int i=n-str.length();i>0;i--) str=str+'0';
}
char add(string &a, string &b, char CarryIn){//计算结果存储在&a
char CarryOut;
int sum, Carry = CarryIn - '0';//此处 注意数据类型
for(int i=a.length()-1;i>=0;i--){
sum=int(a[i]-'0')+int(b[i]-'0')+Carry;
Carry=sum/10;
a[i]=sum%10+'0';
}
CarryOut=Carry+'0';
return CarryOut;
}
int main() {
string a,b,ans;
while(cin>>a>>b){
string aInt=a.substr(0,a.find('.'));//整数、小数分别处理
string aDec=a.substr(a.find('.')+1);
string bInt=b.substr(0,b.find('.'));
string bDec=b.substr(b.find('.')+1);
int nInt=max(aInt.size(),bInt.size());//短数向长数看齐
int nDec=max(aDec.size(),bDec.size());
alignInt(aInt, nInt);
alignInt(bInt, nInt);
alignDec(aDec, nDec);
alignDec(bDec, nDec);
char CinDec='0';//模拟串行进位加法器,进行计算
char CoutDec=add(aDec,bDec,CinDec);//小数相加 向整数最低位进位
char CoutInt=add(aInt,bInt,CoutDec);//CoutDec=CinInt
if(CoutInt!='0') aInt=CoutInt+aInt;//判断整数最高位 是否有进位
cout<<aInt<<'.'<<aDec<<endl;//输出结果
}
return 0;
}