题解

U2023038 2024-12-05 21:23:13 2024-12-05 21:23:36

#include <bits/stdc++.h> using namespace std;

int a[10000]; int aa[10000]; char kww[10000]; int main() { string s, t; cin >> s >> t; int sn=s.find(".");//sn即为小数点的下标,也为串s整数部分长度 int tn=t.find("."); //tn即为小数点的下标,也为串t整数部分长度 int i = s.size() - 1; int j = t.size() - 1; int sn2=i-sn;//为串s小数部分长度 int tn2=j-tn;//为串t小数部分长度 string s1=s.substr(0,sn);//为串s整数部分 string s2=s.substr(sn+1,sn2);//为串s小数部分 string t1=t.substr(0,tn);//为串t整数部分 string t2=t.substr(tn+1,tn2);//为串t小数部分 sn2=sn2-1; tn2=tn2-1; int kss; if(sn2<=tn2) { kss=sn2; for(int i=sn2+1;i<=tn2;i++){ kww[i]=t2[i]; } }else{ kss=tn2; for(int i=tn2+1;i<=sn2;i++){ kww[i]=s2[i]; } } int kss1=kss; int kxx=max(tn2,sn2); int bb=0; int b = 0; int k = 0; while (kss>=0) { if (kss>=0) // 对应位相加 {
aa[k] = s2[kss] - '0' + t2[kss] - '0' + b; kss--;
} if (aa[k] >= 10) // 处理进位 { b = 1; aa[k] = aa[k] % 10; } else { b = 0;
} k++; } int b2=0; if (b == 1) { b2=1; }else{ b2=0; } int k2 = 0; sn--; tn--; while (sn >= 0 || tn >= 0) { if (sn >= 0 && tn >= 0) {
a[k2] = s1[sn] - '0' + t1[tn] - '0' + b2; sn--; tn--;
} else if (sn >= 0) { a[k2] = s1[sn] - '0' + b2; sn--; } else { a[k2] = t1[tn] - '0' + b2; tn--; } if (a[k2] >= 10) // 处理进位 { b2 = 1; a[k2] = a[k2] % 10; } else { b2 = 0;
} k2++; } if (b2 == 1) { cout << 1;
} for (int i = k2 - 1; i >= 0; i--) { cout << a[i]; //输出整数部分 } cout<<'.';//输出小数点 for (int i = k-1; i >= 0; i--) { cout << aa[i]; //输出小数部分的前半部分 } for (int i = kss1+1; i <= kxx; i++) { cout << kww[i]; //输出小数部分的后半部分 }

return 0;

}