#include <iostream> #include<cstring> #include<algorithm> using namespace std; //本题思路是用四个string分别存被加数和加数的整数部分和小数部分进行处理 void float_add() { string str1; string str2; string str_zhengshu1; // 存被加数的整数部分 string str_xiaoshu1; // 存被加数的小数部分 string str_zhengshu2; // 存加数的整数部分 string str_xiaoshu2; // 存加数的小数部分 string str_zhengshu3; // 存结果的整数部分 string str_xiaoshu3; // 存结果的小数部分 cin >> str1; cin >> str2; string::iterator it1; string::iterator it2; string::iterator it3; for (it1 = str1.begin(); *it1 != '.'; it1++) { str_zhengshu1.push_back(*it1); // 存被加数的整数部分 } for (it1 += 1; it1 != str1.end(); it1++) { str_xiaoshu1.push_back(*it1); // 存被加数的小数部分 } for (it2 = str2.begin(); *it2 != '.'; it2++) { str_zhengshu2.push_back(*it2); // 存加数的整数部分 } for (it2 += 1; it2 != str2.end(); it2++) { str_xiaoshu2.push_back(*it2); // 存加数的小数部分 } // 处理小数 int len_xiaoshu1 = str_xiaoshu1.size(); int len_xiaoshu2 = str_xiaoshu2.size(); if (len_xiaoshu1 > len_xiaoshu2) { // 统一小数位数 int k = len_xiaoshu1 - len_xiaoshu2; while (k) { str_xiaoshu2.push_back('0'); // 低位补零 k--; } } else { int k = len_xiaoshu2 - len_xiaoshu1; while (k) { str_xiaoshu1.push_back('0'); // 低位补零 k--; } } // 倒置方便计算 reverse(str_xiaoshu1.begin(), str_xiaoshu1.end()); reverse(str_xiaoshu2.begin(), str_xiaoshu2.end()); // 处理整数 // 倒置方便计算 reverse(str_zhengshu1.begin(), str_zhengshu1.end()); reverse(str_zhengshu2.begin(), str_zhengshu2.end()); int len_zhengshu1 = str_zhengshu1.size(); int len_zhengshu2 = str_zhengshu2.size(); if (len_zhengshu1 > len_zhengshu2) { // 统一整数位数 int k = len_zhengshu1 - len_zhengshu2; while (k) { str_zhengshu2.push_back('0'); // 高位补零 k--; } } else { int k = len_zhengshu2 - len_zhengshu1; while (k) { str_zhengshu1.push_back('0'); // 高位补零 k--; } } // 初始进位为0 int jinwei = 0; // 小数加法 for (it1 = str_xiaoshu1.begin(), it2 = str_xiaoshu2.begin(); it1 != str_xiaoshu1.end(); it1++, it2++) { // 小数部分相加 int x = *it1 - '0'; // 字符转数 int y = *it2 - '0'; // 字符转数 int sum = x + y + jinwei; if (sum > 9) { // 有进位 sum %= 10; jinwei = 1; } else { // 无进位 jinwei = 0; } char ch = sum + '0'; // 数转字符 str_xiaoshu3.push_back(ch); // 插入结果小数部分 } // 整数加法 for (it1 = str_zhengshu1.begin(), it2 = str_zhengshu2.begin(); it1 != str_zhengshu1.end(); it1++, it2++) { // 小数部分相加 int x = *it1 - '0'; // 字符转数 int y = *it2 - '0'; // 字符转数 int sum = x + y + jinwei; if (sum > 9) { // 有进位 sum %= 10; jinwei = 1; } else { // 无进位 jinwei = 0; } char ch = sum + '0'; // 数转字符 str_zhengshu3.push_back(ch); // 插入结果小数部分 } if (jinwei == 1) str_zhengshu3.push_back('1'); // 倒置便于输出 reverse(str_zhengshu3.begin(), str_zhengshu3.end()); reverse(str_xiaoshu3.begin(), str_xiaoshu3.end()); for (auto it = str_zhengshu3.begin(); it != str_zhengshu3.end(); it++) { cout << *it; // 输出整数 } cout << "."; // 输出小数点 for (auto it = str_xiaoshu3.begin(); it != str_xiaoshu3.end(); it++) { cout << *it; // 输出小数 } cout << endl; // test // for (auto it = str_zhengshu1.begin(); it != str_zhengshu1.end(); it++) // { // cout << *it; // } // cout << endl; // for (auto it = str_xiaoshu1.begin(); it != str_xiaoshu1.end(); it++) // { // cout << *it; // } // cout << endl; // for (auto it = str_zhengshu2.begin(); it != str_zhengshu2.end(); it++) // { // cout << *it; // } // cout << endl; // for (auto it = str_xiaoshu2.begin(); it != str_xiaoshu2.end(); it++) // { // cout << *it; // } // cout << endl; } int main() { float_add(); return 0; }