#pragma once
#include<iostream>
#include<vector>
#include<assert.h>
#include<algorithm>
using namespace std;
class BigNumber {
private:
//判断是否为数字
bool isNumber(const string& number) {
int index = 0;
if (number[index] == '-' || number[index] == '+')
++index;
while (index < number.size()) {
if (number[index] < '0' || number[index]>'9') break;
++index;
}
return index == number.size();
}
//数组转为string
string to_string(const vector<int>& c, bool pos) {
int len = c.size();
while (len > 0 && c[len - 1] == 0)
--len;
if (len == 0) return "0";
string C(len, '0');
for (int i = 0; i < C.size(); ++i)
C[C.size() - i - 1] = c[i] + '0';
return pos ? C : ("-" + C);
}
public:
//大数加法
string add(const string& A_, const string& B_) {
assert(isNumber(A_) && isNumber(B_));
//是否做加法
bool isAdd = !((A_[0] == '-') ^ (B_[0] == '-'));
//结果是否为正号
bool pos = A_[0] != '-';
string A(A_, A_[0] == '+' || A_[0] == '-', A_.length());
string B(B_, B_[0] == '+' || B_[0] == '-', B_.length());
//保证A大于B
if (A.size() < B.size() || (A.size() == B.size() && A < B)) {
swap(A, B);
pos = B_[0] != '-';
}
//拆分为数组
vector<int>a(A.length());
vector<int>b(B.length());
vector<int>c(max(A.length(), B.length()) + 1);
for (int i = 0; i < a.size(); ++i)
a[i] = A[A.size() - i - 1] - '0';
for (int i = 0; i < b.size(); ++i)
b[i] = B[B.size() - i - 1] - '0';
//计算
for (int i = 0; i < a.size(); ++i) {
c[i] += a[i];
if (i < b.size())
c[i] = c[i] + b[i] * (isAdd ? 1 : -1);
if (c[i] > 9) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
else if (c[i] < 0) {
c[i + 1] -= 1;
c[i] += 10;
}
}
//转为string
return to_string(c, pos);
}
//大数乘法
string multiply(const string& A, const string& B) {
assert(isNumber(A) && isNumber(B));
if (A == "0" || B == "0") return "0";
//结果是否为正号
bool pos = !((A[0] == '-') ^ (B[0] == '-'));
//去除正负号的长度
int A_len = A.size();
int B_len = B.size();
if (A[0] == '+' || A[0] == '-')--A_len;
if (B[0] == '+' || B[0] == '-')--B_len;
//拆分为数组
vector<int>a(A_len);
vector<int>b(B_len);
vector<int>c(A_len + B_len);
for (int i = 0; i < a.size(); ++i)
a[i] = A[A.size() - i - 1] - '0';
for (int i = 0; i < b.size(); ++i)
b[i] = B[B.size() - i - 1] - '0';
//计算
for (int i = 0; i < a.size(); ++i) {
for (int j = 0; j < b.size(); ++j) {
c[i + j] += a[i] * b[j];
}
}
for (int i = 0; i < c.size(); ++i) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
//转为string
return to_string(c, pos);
}
};
C++实现大数加法和乘法
最新推荐文章于 2022-11-18 11:43:57 发布