#include <iostream> #include <string> #include <bits/stdc++.h> using namespace std; void f_init(string& a, string& a1, string& a2) { int i = 0; int n = a.size(); for (i ; a[i] != '.'; i++)a1.push_back(a[i]); i++; for (i ; i < n; i++)a2.push_back(a[i]); return ; } string func_add(string& a, string& b,bool flag){ if(b.size()>a.size())return func_add(b,a,flag); string ans; int t=0;//用于记录进位 if(flag)t=1;//小数加法有进位 reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); int i; for(i=0;i<b.size();i++){ int temp = a[i]-'0'+b[i]-'0'; temp+=t; if(temp/10){ temp%=10; t=1; }else{ t=0; } ans.push_back(temp+'0'); } while(i<a.size()){ int temp = a[i]-'0'; temp+=t; if(temp/10){ temp%=10; t=1; }else{ t=0; } ans.push_back(temp+'0'); i++; } if(t)ans.push_back(t+'0'); reverse(ans.begin(),ans.end()); return ans; } string func_add1(string& a, string& b) {//小数加 if (b.size() > a.size())return func_add1(b, a); string ans; //b小数点后补零,使其长度与a的小数长度一致 while(b.size()<a.size()){ b.push_back('0'); } int t=0;//用于记录进位 int n=a.size(); for(int i=n-1;i>=0;i--){//从小数最小位开始计算 int temp = a[i]-'0'+b[i]-'0'; temp+=t; if(temp/10){//有进位 temp%=10; t=1; }else{ t=0; } ans.push_back(temp+'0'); } if(t)ans.push_back(t+'0'); reverse(ans.begin(),ans.end()); return ans; } int main() { string a, b; while (cin >> a >> b) { // 注意 while 处理多个 case string a1, a2; string b1, b2; f_init(a, a1, a2); f_init(b, b1, b2); string ans1 = func_add1(a2,b2); bool flag=false;//标志小数加法是否有进位 if(ans1.size()>max(a2.size(),b2.size())){ //说明小数有进位 ans1=ans1.substr(1,ans1.size()-1); flag=true; } string ans=func_add(a1,b1,flag); cout<<ans<<'.'<<ans1; } return 0; } // 64 位输出请用 printf("%lld")