题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
- 先将长短可能不一的两数对齐(补零);
- 然后利用串行进位加法器的方法,由低位到高位逐位计算,先算小数部分再算整数部分
#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; }