#include <cstdlib> #include <iostream> #include <string> using namespace std; //这一题真难,不过写出来真有成就感 int main() { string a, b; cin >> a; cin >> b; //先处理字符串 int dot = a.find('.'); int dot2 = b.find('.');//找两个串小数点·的下标 int cha = dot - dot2;//小数点.前短的串需要补0 if (cha > 0) {//说明a长b短 b.insert(0, cha, '0');//b前插差值个0 } else {//说明a短b长 cha = dot2 - dot; a.insert(0, cha, '0');//a前插0 } if (a.size() < b.size()) { //b长于a则交换,保证a为长串 a.swap(b); } b.insert(b.size(), a.size() - b.size(), '0');//在短串b后插入ab长度差个0 //先补齐较短一方的长度 //再进行运算 int carry = 0;//存储进位位 dot = dot > dot2 ? dot : dot2;//dot为较长子串的小数点,即为处理后的串公共的小数点 for (int i = a.length() - 1; i > dot ; i--) {//从后往前加 int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0';//计算机相加之后的本位数并%10 carry = (a[i] - '0' + b[i] - '0' + carry) / 10;//计算进位位,结果为0/1 a[i] = result ; } for (int i = dot - 1; i >= 0; i--) {//往小数点.前继续加,不要忘了上一步循环最后的进位carry int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0'; carry = (a[i] + b[i] - '0' - '0' + carry) / 10; a[i] = result ; } //如果最高位还有进位那么必为1,在结果串a最前面插1即可 if (carry = 1) { int result = (a[0] - '0' + b[0] - '0' + carry) % 10; string s; s[0] = (result + '0'); a.insert(0, s); cout << a << endl; } } // 64 位输出请用 printf("%lld")