請用C++實現帶負數的高精度運算
时间: 2023-07-11 14:17:23 浏览: 41
好的,以下是一个简单的高精度加法的 C++ 实现,支持负数:
```C++
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 高精度加法
vector<int> add(vector<int> &a, vector<int> &b) {
vector<int> c;
int t = 0;
for (int i = 0; i < a.size() || i < b.size(); ++i) {
if (i < a.size()) t += a[i];
if (i < b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
if (t) c.push_back(1);
return c;
}
// 高精度减法,仅支持 a >= b
vector<int> sub(vector<int> &a, vector<int> &b) {
vector<int> c;
for (int i = 0, t = 0; i < a.size(); ++i) {
t = a[i] - t;
if (i < b.size()) t -= b[i];
c.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
while (c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
// 高精度乘以低精度
vector<int> mul(vector<int> &a, int b) {
vector<int> c;
int t = 0;
for (int i = 0; i < a.size() || t; ++i) {
if (i < a.size()) t += a[i] * b;
c.push_back(t % 10);
t /= 10;
}
return c;
}
// 高精度除以低精度
vector<int> div(vector<int> &a, int b, int &r) {
vector<int> c;
r = 0;
for (int i = a.size() - 1; i >= 0; --i) {
r = r * 10 + a[i];
c.push_back(r / b);
r %= b;
}
reverse(c.begin(), c.end());
while (c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
// 高精度比较,a > b 返回 1,a == b 返回 0,a < b 返回 -1
int cmp(vector<int> &a, vector<int> &b) {
if (a.size() > b.size()) return 1;
if (a.size() < b.size()) return -1;
for (int i = a.size() - 1; i >= 0; --i) {
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
// 高精度转整数
int to_int(vector<int> &a) {
int res = 0;
for (int i = a.size() - 1; i >= 0; --i) {
res = res * 10 + a[i];
}
return res;
}
// 读入高精度整数
vector<int> read(string s) {
vector<int> a;
for (int i = s.size() - 1; i >= 0; --i) {
a.push_back(s[i] - '0');
}
return a;
}
// 输出高精度整数
void print(vector<int> &a) {
for (int i = a.size() - 1; i >= 0; --i) {
cout << a[i];
}
cout << endl;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
// 判断两个数的符号
bool neg1 = false, neg2 = false;
if (s1[0] == '-') {
neg1 = true;
s1.erase(s1.begin());
}
if (s2[0] == '-') {
neg2 = true;
s2.erase(s2.begin());
}
vector<int> a = read(s1), b = read(s2);
if (neg1) a.back() = -a.back();
if (neg2) b.back() = -b.back();
// 高精度加法
vector<int> c = add(a, b);
print(c);
// 高精度减法
if (cmp(a, b) >= 0) {
c = sub(a, b);
print(c);
} else {
c = sub(b, a);
cout << "-";
print(c);
}
// 高精度乘以低精度
c = mul(a, 3);
print(c);
// 高精度除以低精度
int r;
c = div(a, 3, r);
print(c);
cout << r << endl;
return 0;
}
```
这个程序可以读入两个高精度整数,支持加、减、乘、除等操作,并且支持负数。注意,这里使用了一个小技巧,即将负数的符号存储在最高位,方便后续的处理。