高精度模板,效率一般,不过大部分题目可以凑合凑合过。
追求极致的大佬可以忽略了。
class BN {//大数字 比较 加法 乘法 cout
private:
static const int MAXN = 86;
int data[MAXN];
int len;
public:
BN() { len = 1; data[0] = 0; for (int i = 0; i < MAXN; ++i) { data[i] = 0; } } //默认初始化为0;
BN(int a){
for (int i = 0; i < MAXN; ++i) { data[i] = 0; }
len = 0;
do {
data[len] = a % 10;
a /= 10;
len++;
}while(a);
}
bool operator<(const BN& a) const { //这地方的第二个const是必须的 否则就会报错 (可能是用了vector的缘故吧我这么猜)
if (len < a.size()) {
return true;
}
else if (len == a.size()) {
for (int i = len-1; i >=0; --i) {
if (data[i] < a.data[i]) {
return true;
}
else if (data[i] > a.data[i]) {
return false;
}
}
}
return false;
}
BN operator+(const BN& a) {
BN ret(0);
int i = 0, j = 0;
int jin = 0;
int temp;
ret.len = 0;
while (i < len && j < a.size()) {
temp = jin + data[i++] + a.data[j++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
while (i < len) {
temp = jin + data[i++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
while (j < a.size()) {
temp = jin + a.data[j++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
if (jin != 0) {
ret.data[ret.len++] = jin;
}
return ret;
}
BN operator*(const BN& a) {
if ((a.size() == 1&& a.data[0] == 0 )||( len == 1 && data[0] == 0)) {
return BN(0);
}
BN ret(0);
int jin=0, cur=0, temp=0;
for (int i = 0; i < len; ++i) {
jin = 0,cur = i,temp = 0;
for (int j = 0; j < a.size(); ++j) {
temp = data[i] * a.data[j] + jin + ret.data[cur];
ret.data[cur++] = temp % 10;
jin = temp / 10;
}
if (jin) {
ret.data[cur++] = jin;
}
}
while (cur > 1 && ret.data[cur - 1] == 0) {
cur--;
}
ret.len = cur;
return ret;
}
/*
friend ostream & operator<<(ostream& cot,BN & a) {
for (int i = a.len - 1; i >= 0; --i) {
cot << a.data[i];
}
return cot;
}*/
friend ostream& operator<<(ostream& cot,const BN& a) { ///这样就可以使用cout<<a*b 了 分析原因如下:a*b返回一个BN,但是他很快会被释放(因为是返回值) ,const BN & a = xxx 底层上是创建了一个变量来存储xxx 然后对其引用
for (int i = a.len - 1; i >= 0; --i) {
cot << a.data[i];
}
return cot;
}
int size() const {
return len;
}
};
有缺陷还请指出!