用string不用algorithm實現支持負數的高精度小數減法
时间: 2024-03-05 18:50:01 浏览: 26
好的,我可以为你解答这个问题。
首先,我们需要将两个小数转换成字符串并存储在两个string类型的变量中。然后,我们需要判断它们的正负号,如果两个小数的正负号不同,则可以将它们看作加法运算,否则为减法运算。
接下来,我们可以将小数字符串分为整数部分和小数部分,分别存储在两个vector中。为了方便计算,我们可以将小数部分的位数补齐,使其与另一个小数部分的位数相同。
然后,我们从小数部分的最后一位开始,依次相减。如果结果小于0,则需要向前一位借位,并将当前位加上10。在进行减法运算时,我们需要将整数部分和小数部分分开计算,最后将它们合并起来,并去除前导零。
下面是一个示例代码,供你参考:
```
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string subtract(string num1, string num2) {
int sign1 = 1, sign2 = 1;
if (num1[0] == '-') {
sign1 = -1;
num1 = num1.substr(1);
}
if (num2[0] == '-') {
sign2 = -1;
num2 = num2.substr(1);
}
if (sign1 * sign2 == -1) {
return add(num1, num2);
}
vector<int> vec1, vec2;
int pos1 = num1.find('.'), pos2 = num2.find('.');
if (pos1 == string::npos) {
pos1 = num1.size();
}
if (pos2 == string::npos) {
pos2 = num2.size();
}
for (int i = pos1 - 1; i >= 0; i--) {
vec1.push_back(num1[i] - '0');
}
for (int i = pos2 - 1; i >= 0; i--) {
vec2.push_back(num2[i] - '0');
}
int len = max(vec1.size(), vec2.size());
vec1.resize(len), vec2.resize(len);
vector<int> res;
int carry = 0;
for (int i = len - 1; i >= 0; i--) {
int diff = vec1[i] - vec2[i] - carry;
if (diff < 0) {
diff += 10;
carry = 1;
} else {
carry = 0;
}
res.push_back(diff);
}
int pos = res.size() - 1;
while (pos > 0 && res[pos] == 0) {
pos--;
}
string result;
if (pos1 == num1.size() && pos2 == num2.size()) {
result += to_string(res[pos]);
} else {
for (int i = pos; i >= 0; i--) {
result += to_string(res[i]);
}
result += '.';
for (int i = pos1 - 1; i > pos; i--) {
result += num1[i];
}
for (int i = pos2 - 1; i > pos; i--) {
result += num2[i];
}
}
if (sign1 * sign2 == -1) {
result = '-' + result;
}
return result;
}
int main() {
string num1 = "-3.14", num2 = "2.5";
cout << subtract(num1, num2) << endl; // 输出: -5.64
return 0;
}
```
希望这个代码能够帮助到你,如果还有什么问题,请随时问我。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)