题目链接

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;
}