算法竞赛入门经典BigInteger的实现,其中有些地方还是不是很懂,先存着,看懂的网友可以帮忙标注下,然后交流学习下。
参考代码
struct BigInteger {
static const int BASE = 100000000;//其数量级代表数组每个元素能够存的位数。数量级是几说明每个元素能存的位数就是几。如10:则只能存0-9;100:存0-99
// static const int BASE = 100;
static const int WIDTH = 8; // 代表数组每个元素能够存的位数
vector<int> s;
BigInteger(long long num = 0) {
*this = num; // 构造函数 用this指代大整数,对于指针来说永远是4字节。很方便。
}
BigInteger operator = (long long num) { // 赋值运算符
s.clear();
//cout<<num<<endl;
do {
cout<<num % BASE<<endl;
s.push_back(num % BASE);//老套路了,先求余,再把余舍去。进制转换也是这个原理(只不过最后是倒着输出)
num /= BASE;
cout<<num<<endl;
} while(num > 0);
return *this;
}
BigInteger operator = (const string& str) { // 赋值运算符 这部分大佬写的很精辟,所以我看不懂。
s.clear();
int x, len = (str.length() - 1) / WIDTH + 1;
for(int i = 0; i < len; i++) {
int end = str.length() - i*WIDTH;
int start = max(0, end - WIDTH);
sscanf(str.substr(start, end-start).c_str(), "%d", &x);
s.push_back(x);
}
return *this;
}
BigInteger operator + (const BigInteger& b) const {//大佬写的很棒,但我不懂。
BigInteger c;
c.s.clear();
for(int i = 0, g = 0; ; i++) {
if(g == 0 && i >= s.size() && i >= b.s.size()) break;
int x = g;
if(i < s.size()) x += s[i];
if(i < b.s.size()) x += b.s[i];
c.s.push_back(x % BASE);
g = x / BASE;
}
return c;
}
};
ostream& operator << (ostream &out, const BigInteger& x) {//重载 <<
out << x.s.back();//第一部分有可能不会占满,所以直接输出。
for(int i = x.s.size()-2; i >= 0; i--) {//逆序输出 数组
char buf[20];//用于存放数据
sprintf(buf, "%08d", x.s[i]);// 将 每个元素 放到 buf字符串中去,不足的左补0
for(int j = 0; j < strlen(buf); j++) out << buf[j];//输出即可
}
return out;//方便链式书写。
}
istream& operator >> (istream &in, BigInteger& x) {// 重载 >>
string s;
if(!(in >> s)) return in;//先把字符串读进 s
x = s;// 把 s 赋值给 要赋的那个值。 x是那个值的引用哦。
return in;
}
#include<set>
#include<map>
set<BigInteger> s;
map<BigInteger, int> m;
int main() {
BigInteger y;
BigInteger x = y;
BigInteger z = 123;
BigInteger a, b;
cin >> a >> b;
cout << a + b << "\n";
cout << BigInteger::BASE << "\n";
//BigInteger b(10),a;
// a = b;
// BigInteger b;
// b ="1234567890456789123";
//cout<<b;
return 0;
}