按照计算机组成原理的知识,整一个sum函数作为加法器即可
用inputCarry和outputCarry来传递进位
然后将两个字符串的整数、小数部分各自对齐,各自使用sum函数
#include<iostream>
#include<string>
using namespace std;
void paddingLeft(string &s,int num){
if(s.size()==num) return;
int padding = num-s.size();
for(int i=0;i<padding;i++) s="0"+s;
}
void paddingRight(string &s,int num){
if(s.size()==num) return;
int padding = num-s.size();
for(int i=0;i<padding;i++) s+="0";
}
string sum(string a,string b,int &outputCarry,int inputCarry=0){
string::reverse_iterator it1 = a.rbegin();
string::reverse_iterator it2 = b.rbegin();
string ans = "";
int carry = inputCarry;
while(it1!=a.rend()){//已经对齐过了反正
int sum = (*it1-'0')+(*it2-'0')+carry;
//计算本位并拼接字符串
int remain = sum%10;
char digit = '0'+remain;
ans = digit+ans;
//进位到下一位
carry = sum/10;
it1++;
it2++;
}
outputCarry = carry;
return ans;
}
int main(){
string a,b;
while(cin>>a>>b){
//提取整数/小数部分
string aU = a.substr(0,a.find('.'));
string aL = a.substr(a.find('.')+1);
string bU = b.substr(0,b.find('.'));
string bL = b.substr(b.find('.')+1);
//对齐
int dU = aU.size()>=bU.size()?aU.size():bU.size();
int dL = aL.size()>=bL.size()?aL.size():bL.size();
paddingRight(aL,dL);
paddingRight(bL,dL);
paddingLeft(aU,dU);
paddingLeft(bU,dU);
//计算
int cL=0;//小数部分进位
int cU=0;//整数部分进位
string sL = sum(aL,bL,cL);
string sU = sum(aU,bU,cU,cL);
if(cU==1) sU = '1'+sU;
//输出
cout<<sU<<'.'<<sL<<endl;
}
return 0;
}

京公网安备 11010502036488号