题解 | 浮点数加法 补'0',各各位相加 ASCII相加 '0'='0' '1'='0'+1
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include <iostream> #include <string> using namespace std; // 获取整数部分 string getInteger(string a) { // 从0开始 截取a.find(".")长度 // 截取[ ) 左闭右开区间 return a.substr(0, a.find(".")); } // 获取小数部分 string getFraction(string a) { // a.size()实际长度,但是下标要-1。 find()得到的为下标 // 从a.find(".") + 1开始 截取a.size() - a.find(".")长度 // 截取[ ) 左闭右开区间(所以加1) // 从"."后开始截取(不含".") 截取长度刚好 长度=(结尾 - "."后一位 + 1) //return a.substr(a.find(".")+1,a.size()-1-a.find(".")-1+1); // 多截取一位,但是字符串结束了 return a.substr(a.find(".") + 1, a.size() - a.find(".")); } // 当需要返回多个值时。使用引用参数 返回信息 void fractionPlus(string& res, int& carry, string fa, string fb) { // 长度小的字符串 补0对齐 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[i],否则像vector没申请空间越界 res.resize(size); // 给res申请两者中最大空间 carry = 0; // 最低一位进位为0 for (int i = size - 1; i >= 0; i--) { // 从最低位开始计算 // '0' = '0' 字符0 不为数字0,为字符0 ASCII码大小超过0 // '3' = '0' + 3 字符3(大于0的n)为 字符0 + 数字3(n) // '0' + '3'(字符相加) ='0' + 3(前面就为结果'3') + '0'(多余的) // 所以要减去字符0 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; } } } // 小数部分才需要获取向整数的进位,不用引用carry void integerPlus(string& res, int carry, string ia, string ib) { int size = max(ia.size(), ib.size()); while (ia.size() < size) { ia.insert(ia.begin(), '0'); // 前置补0 } while (ib.size() < size) { ib.insert(ib.begin(), '0'); // 前置补0 } res.resize(size); // 给res申请两者中最大空间 for (int i = size - 1; i >= 0; i--) { // 从最低位开始计算 if (ia[i] + ib[i] - '0' + carry > '9') { // 有进位 res[i] = ia[i] + ib[i] - '0' + carry - 10; // 取余数 -10 carry = 1; } else { // 无进位 res[i] = ia[i] + ib[i] - '0' + carry; // 没有进位也要加上 低位的 进位 carry = 0; } } if (carry == 1) { res.insert(res.begin(), '1'); // 最后有进位 } } int main() { string a ; string b ; while (cin >> a >> b) { string ia = getInteger(a); string ib = getInteger(b); string fa = getFraction(a); string fb = getFraction(b); string fres; // 小数部分结果 int carry; // 进位比较小,用int。 除了小数部分最后一位进位为0,其它都根据计算为依据 fractionPlus(fres, carry, fa, fb); string ires; // 整数部分结果 integerPlus(ires, carry, ia, ib); cout << ires << "." << fres << endl; } return 0; }#考研##复试练习#
2025考研复试 文章被收录于专栏
复试ing,努力中。。。