题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
纯字符串的方法,利用0~10的ascii和设置进位位(CF)分别计算小数和整数,仅供参考。
//
// Created by alphatk on 2023/1/18.
//
# include "iostream"
# include "string"
using namespace std;
// 本题代码写的不是很优异,仅供参考
class num { // 将输入的数封装成类(struct同理)
public:
int sizeLeft; // 整数部分
int sizeRight; // 小数部分
string data; // 数据部分
num(string input) { // 构造函数:求出整数部分、小数部分长度
data = input;
int i = 0;
sizeLeft = sizeRight = 0;
while (input[i++] != '.') sizeLeft++;
sizeRight = input.size() - sizeLeft - 1;
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
// Define:
string str1, str2;
// Input:
cin >> str1;
num res(str1);
while (cin >> str2) { // 可进行多轮加法
num addNum(str2); // 创建类
int CarryFlag = 0, i = 0; // 小数侧进位标志
string newNum;
// 【右侧】计算小数部分:开始计算的位置应该是较小的数的最后一位,多出的部分直接复制
if (res.sizeRight > addNum.sizeRight) {
newNum += res.data.substr(res.sizeLeft + 1 + addNum.sizeRight);
i = addNum.sizeRight-1;
} else {
newNum += addNum.data.substr(addNum.sizeLeft + 1 + res.sizeRight);
i = res.sizeRight-1;
}
for (; i>=0; --i) {
char culculate; // 当前位的计算
culculate = (res.data[res.sizeLeft+1+i] - '0' + addNum.data[addNum.sizeLeft+1+i] - '0') + '0';
if (CarryFlag == 1) { // 如果上一次计算有进位
culculate += 1;
CarryFlag = 0;
}
if (culculate > '9') { // 如果本次计算有进位
CarryFlag = 1;
culculate -= 10;
}
newNum = culculate + newNum; // 形成新的字符串(采用左拼接)
}
newNum = '.' + newNum;
// 【左侧】计算
int j = res.sizeLeft - 1; // 整数部分计算的起始位置
int k = addNum.sizeLeft - 1;
while (j >= 0 || k >= 0) {
char culculate;
if (j >= 0 && k >= 0) culculate = (res.data[j] - '0' + addNum.data[k] - '0') + '0';
else if (j >= 0 && k < 0) culculate = res.data[j];
else
culculate = addNum.data[k];
if (CarryFlag == 1) { // 进位
culculate += 1;
CarryFlag = 0;
}
if (culculate > '9') {
CarryFlag = 1;
culculate -= 10;
}
newNum = culculate + newNum;
j--;
k--;
}
cout << newNum << endl;
return 0;
}
}

