高精度小数加法不用vector
时间: 2023-07-26 15:03:37 浏览: 84
以下是一个高精度小数加法的 C++ 实现,使用了字符串来存储小数,并且支持任意精度。假设输入的两个小数 a 和 b 都是非负数,且小数位数不超过 1000。
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string add(string a, string b) {
int lena = a.length(), lenb = b.length();
if (lena < lenb) {
swap(a, b);
swap(lena, lenb);
}
int carry = 0;
string res = "";
int p = lena - 1, q = lenb - 1;
while (q >= 0) {
int sum = a[p] - '0' + b[q] - '0' + carry;
res += to_string(sum % 10);
carry = sum / 10;
p--;
q--;
}
while (p >= 0) {
int sum = a[p] - '0' + carry;
res += to_string(sum % 10);
carry = sum / 10;
p--;
}
if (carry) {
res += to_string(carry);
}
reverse(res.begin(), res.end());
return res;
}
int main() {
string a, b;
cin >> a >> b;
string ans = add(a, b);
int dot = ans.find('.');
if (dot == string::npos) { // 如果没有小数部分
cout << ans << endl;
} else { // 如果有小数部分
int len = ans.length() - 1; // 最后一位的下标
while (len > dot && ans[len] == '0') { // 去除末尾的 0
len--;
}
if (len == dot) { // 如果小数部分为 0
ans.erase(dot); // 删掉小数点
} else { // 如果小数部分不为 0
ans.erase(len + 1); // 删掉多余的 0
}
if (ans[0] == '0') { // 如果整数部分为 0
ans.erase(0, 1); // 删掉前导 0
}
cout << ans << endl;
}
return 0;
}
```
对于输入的两个小数 a 和 b,我们直接使用上一题的高精度小数加法来计算它们的和。计算完毕后,根据小数点的位置,判断是否有小数部分。如果没有小数部分,则直接输出整个字符串;如果有小数部分,则去除末尾的 0,然后判断小数部分是否为 0,如果是则删掉小数点,否则删掉多余的 0。最后,如果整数部分为 0,则删掉前导 0。
需要注意的是,上面的代码假设输入的小数部分没有前导 0,例如 `2.5` 和 `3.0`,而不是 `2.500` 和 `3.000`。如果输入的小数部分有前导 0,那么在计算时需要先把前导 0 去掉。
阅读全文