题解 | 浮点数加法
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8?tpId=61&tqId=29551&tPage=3&ru=/kaoyan/retest/1002&qru=/ta/pku-kaoyan/question-ranking
#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;
}
阿里云工作强度 667人发布