浮点数大数相加求和
(一)兩個(gè)非負(fù)的浮點(diǎn)數(shù)相加
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <map> #include <stack> #include <queue> #include <string> #include <vector> using namespace std;// 判斷是否含有小數(shù)點(diǎn) bool has_dot(string num) {for(int i = 0; i < num.length(); ++i)if(num[i] == '.')return true;return false; }// 獲取小數(shù)點(diǎn)的位置 int get_dot_pos(string num) {for(int i = 0; i < num.length(); ++i)if(num[i] == '.')return i; }// 刪除小數(shù)后面的尾數(shù)0 string del_tail_zero(string num) {while(*(num.end() - 1) == '0')num.erase(num.end() - 1);if(*(num.end() - 1) == '.')num.erase(num.end() - 1);return num; }string add(string a, string b) {reverse(a.begin(), a.end());reverse(b.begin(), b.end());string sum = "";int carry = 0;for(int i = 0; i < a.length(); ++i) {int s = (a[i] - '0') + (b[i] - '0') + carry;sum = sum + char(s % 10 + '0');carry = s / 10;}if(carry == 1)sum.append("1");reverse(sum.begin(), sum.end());return sum; }string get_sum(string a, string b) {bool a_has_dot = has_dot(a), b_has_dot = has_dot(b); // 全部轉(zhuǎn)化成小數(shù)處理if(a_has_dot && !b_has_dot) {b.append(".0");}else if(!has_dot && b_has_dot) {a.append(".0");}else if(!a_has_dot && !b_has_dot) {a.append(".0");b.append(".0");}int a_dot_pos = get_dot_pos(a), b_dot_pos = get_dot_pos(b); // 小數(shù)點(diǎn)位置string a_int = a.substr(0, a_dot_pos), b_int = b.substr(0, b_dot_pos); // 獲取整數(shù)部分string a_float = a.substr(a_dot_pos + 1, a.length() - a_dot_pos - 1), b_float = b.substr(b_dot_pos + 1, b.length() - b_dot_pos - 1); // 獲取小數(shù)部分int int_add_length = abs(int(a_int.length() - b_int.length())), float_add_length = abs(int(a_float.length() - b_float.length())); // 判斷整數(shù)和小數(shù)上的位數(shù)是否相同if(int_add_length != 0) { // 使a和b的整數(shù)位位數(shù)相同if(a_int.length() > b_int.length()) {reverse(b_int.begin(), b_int.end());for(int i = 0; i < int_add_length; ++i)b_int.append("0");reverse(b_int.begin(), b_int.end());}else {reverse(a_int.begin(), a_int.end());for(int i = 0; i < int_add_length; ++i)a_int.append("0");reverse(a_int.begin(), a_int.end());}}if(float_add_length != 0) { // 使a和b的小數(shù)位位數(shù)相同if(a_float.length() > b_float.length()) {for(int i = 0; i < float_add_length; ++i)b_float.append("0");}else {for(int i = 0; i < float_add_length; ++i)a_float.append("0");}}string int_ans = add(a_int, b_int); // 整數(shù)部分的和string float_ans = add(a_float, b_float); // 小數(shù)部分的和if(float_ans.length() > a_float.length()) { // 小數(shù)位產(chǎn)生進(jìn)位int_ans = add(int_ans, "1");float_ans.erase(float_ans.begin());}string ans = "";ans.append(int_ans);ans.append(".");ans.append(float_ans);return del_tail_zero(ans); }int main() {freopen("1.txt", "r", stdin);string a, b;while(cin >> a >> b) {cout << get_sum(a, b) << endl;}return 0; }(二)任意兩個(gè)浮點(diǎn)數(shù)相加
總結(jié)
- 上一篇: 为什么阿里巴巴Java开发手册中强制要求
- 下一篇: 常见单链表面试题