其实这篇博客挺没有营养的,大整数算一个正式的算法么?不算吧,只是模拟了手动计算的过程而已。其中需要的注意的就是进制问题和进位问题。
下面的代码甚是丑陋,还请各位不吝赐教!
#include <iostream>
#include <vector>
using namespace std;
class bigNum{
public:
vector<int> vec;
bigNum();
bigNum(string str);
bigNum(int num);
string toString() const;
bigNum operator + (const bigNum &a) const;
bigNum operator * (const bigNum &a) const;
bool operator == (const bigNum &a) const;
friend istream& operator >> (istream &in, bigNum &a);
friend ostream& operator << (ostream &out, bigNum &a);
};
bigNum::bigNum() {
vec.push_back(0);
}
bigNum::bigNum(string str) {
for (int i = str.size(); i >= 0; i -= 4) {
int t = 0;
for (int j = max(i - 4, 0); j < i; ++j) {
t = t * 10 + str[j] - '0';
}
vec.push_back(t);
}
}
bigNum::bigNum(int num) {
while (num) {
vec.push_back(num % 10000);
num /= 10000;
}
}
bigNum bigNum::operator + (const bigNum &a) const {
bigNum b;
b.vec.clear();
int t = 0;
for (int i = 0, j = 0; i < this->vec.size() || j < a.vec.size(); ++i, ++j) {
if (i < this->vec.size() && j < a.vec.size()) t += this->vec[i] + a.vec[j];
else if (i >= this->vec.size()) t += a.vec[j];
else t += this->vec[i];
b.vec.push_back(t % 10000);
t /= 10000;
}
if (t) b.vec.push_back(t);
return b;
}
bigNum bigNum::operator * (const bigNum &a) const {
bigNum b;
for (int i = 0; i < this->vec.size(); ++i) {
for (int j = 0; j < a.vec.size(); ++j) {
if (i + j >= b.vec.size()) b.vec.push_back(this->vec[i] * a.vec[j]);
else b.vec[i + j] += this->vec[i] * a.vec[j];
}
int t = 0;
for (int j = 0; j < b.vec.size(); ++j) {
if (b.vec[j] / 10000 && j + 1 != b.vec.size()) b.vec[j + 1] += b.vec[j] / 10000;
else if (b.vec[j] / 10000) b.vec.push_back(b.vec[j] / 10000);
b.vec[j] %= 10000;
}
}
while (b.vec.size() > 1 && b.vec[b.vec.size() - 1] == 0) b.vec.pop_back();
return b;
}
string bigNum::toString() const {
string ans;
for (int i = vec.size() - 1; i >= 0; --i) {
int t = vec[i];
string str;
while (t) {
str += t % 10 + '0';
t /= 10;
}
if (str == "") str += '0';
while (i != vec.size() - 1 && str.size() < 4) str += '0';
for (int j = str.size() - 1; j >= 0; --j) ans += str[j];
}
return ans;
}
bool bigNum::operator == (const bigNum &a) const {
return this->toString() == a.toString();
}
istream& operator >> (istream &in, bigNum &a) {
string t;
in >> t;
bigNum b(t);
a = b;
return in;
}
ostream& operator << (ostream &out, bigNum &a) {
out << a.toString();
return out;
}
int main() {
bigNum a("5000"), b(2000000);
bigNum c = a * b;
cout << c << endl;
c = a + b;
cout << c << endl;
cin >> a >> b;
c = a + b * a;
cout << c << endl;
return 0;
}
代码大致是写完了,以后有时间会慢慢升级更新的,因为有写地方还有待优化。
还有,不支持负数、减法、乘法、位运算,本来想一并写了的,不过感觉过于麻烦,还是留到今后有空的时候再更新吧,注释也留到以后更新的时候再写吧。