纯字符串的方法,利用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; } }