题解 | 浮点数加法 补'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,努力中。。。

