// 求整数部分不补零的方法(vector<char>/string前置补零时间复杂度高) #include <iostream> #include <string> using namespace std; // 获取整数部分 string getInteger(string a) { return a.substr(0, a.find(".")); } // 获取小数部分 string getFraction(string a) { return a.substr(a.find(".") + 1, a.size() - a.find(".")); } // 当需要返回多个值时。使用引用参数 返回信息 void fractionPlus(string& res, int& carry, string fa, string fb) { int size = max(fa.size(), fb.size()); while (fa.size() < size) { fa.push_back('0'); // 补0 } while (fb.size() < size) { fb.push_back('0'); // 补0 } res.resize(size); carry = 0; for (int i = size - 1; i >= 0; i--) { if (fa[i] + fb[i] - '0' + carry > '9') { // 有进位 res[i] = fa[i] + fb[i] - '0' + carry - 10; // 取余数 -10 carry = 1; } else { // 无进位 res[i] = fa[i] + fb[i] - '0' + carry; carry = 0; } } return; //要不要无所谓,void 不用返回 } void integerPlus(string& res, int carry, string ia, string ib) { // !!! carry = 1。 a访问完,b访问完,carry=1也要进循环内 for (int i = ia.size() - 1, j = ib.size() - 1; i >= 0 || j >= 0 || carry == 1; i--,j--) { // a没访问完 || b没访问完 || 进位为1(a="99" b="11"最高位进位情况) 进入循环 if (i >= 0 && j >= 0) { // a没访问完 + b没访问完 if (ia[i] + ib[j] + carry - '0' > '9') { //访问ib 用j // !!! 下面是错误的,res没申请空间,不能直接访问。用res.resize(n);申请 // res[i] = ia[i] + ib[i] + carry - '0' - 10; // 取余 // 用取余 插入(后续情况类似) res.insert(res.begin(), ia[i] + ib[j] + carry - '0' - 10) ; carry = 1; } else { res.insert(res.begin(), ia[i] + ib[j] + carry - '0'); carry = 0; } } else if(i >= 0 && j < 0) { // a没访问完,b访问完了 a='99' b='1' // ib[i] 当0 if (ia[i] + carry > '9') { // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加 res.insert(res.begin(), ia[i] + carry - 10); // 取余 carry = 1; } else { res.insert(res.begin(), ia[i] + carry); carry = 0; } } else if (i < 0 && j >= 0) { // a访问完了,b没访问完 a='1' b='99' // ia[i] 当0 if (ib[j] + carry > '9') { // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加 res.insert(res.begin(), ib[j] + carry - 10); // 取余 carry = 1; } else { res.insert(res.begin(), ib[j] + carry); carry = 0; } } else { // a,b都访问完了,但是最高位有进位 a='99' b='10' res.insert(res.begin(),'1'); // 最高位补1 } } return; //要不要无所谓,void 不用返回 } int main() { char arra[1000] = { 0 }; // 初始化 char arrb[1000] = { 0 }; while (scanf("%s%s",arra,arrb) != EOF) { //没结束 string a = arra; string b = arrb; string ia = getInteger(a); string ib = getInteger(b); string fa = getFraction(a); string fb = getFraction(b); string fres; // 小数部分结果 int carry; fractionPlus(fres, carry, fa, fb); string ires; // 整数部分结果 integerPlus(ires, carry, ia, ib); // string 输出用.c_str()方法 printf("%s.%s",ires.c_str(), fres.c_str()); } return 0; }