54.87
674.92
首先用字符串读入,把整数部分z和小数部分x分开存放在数组中,并记录长度zl和xl
首先将小数部分相加,从后往前加;然后保留进位carry。
整数部分先逆序变成
45
476
然后从前往后加,注意加到最大长度后,需要判断进位carry是否为0,不为0时,还需要进位。
最后输出,整数部分逆序输出,小数部分正序输出。
#include<bits/stdc++.h>
using namespace std;
struct F{
int z[1005],x[1005];
int zl,xl;
F(){
memset(z,0,sizeof(z));
memset(x,0,sizeof(x));
zl=0,xl=0;
}
};
int main(){
string str1,str2;
F a,b,c;
while(cin>>str1>>str2){
int flag=0;
//str1
for(int i=0;i<str1.size();i++){ //将字符串浮点数转换为整数部分和小数部分
if(str1[i] == '.'){
flag=1;
continue;
}
if(flag==0){
a.z[a.zl++] = str1[i] - '0';
}else{
a.x[a.xl++] = str1[i] - '0';
}
}
//str2
flag=0;
for(int i=0;i<str2.size();i++){ //将字符串浮点数转换为整数部分和小数部分
if(str2[i] == '.'){
flag=1;
continue;
}
if(flag==0){
b.z[b.zl++] = str2[i] - '0';
}else{
b.x[b.xl++] = str2[i] - '0';
}
}
//先求小数部分的和
int carry=0; //进位
c.xl = max(a.xl, b.xl);
for(int i=0;i<a.xl ||i<b.xl;i++){
c.x[c.xl-1-i] = (a.x[c.xl-1-i] + b.x[c.xl-1-i] + carry) % 10;
carry = (a.x[c.xl-1-i] + b.x[c.xl-1-i] + carry) / 10;
}
c.zl = max(a.zl, b.zl);
reverse(a.z, a.z + a.zl);
reverse(b.z, b.z + b.zl);
for(int i=0;i<a.zl ||i<b.zl;i++){
c.z[i] = (a.z[i] + b.z[i] + carry) % 10;
carry = (a.z[i] + b.z[i] + carry) / 10;
}
if(carry!=0) c.z[c.zl++] = 1;
for(int i=c.zl-1;i>=0;i--){
cout<<c.z[i];
}
cout<<".";
for(int i=0;i<c.xl;i++){
cout<<c.x[i];
}
cout<<endl;
}
return 0;
}