高精度模板

持续更新—
目前支持两个类相加相乘,类加乘整数,++x以及x++,赋值。

struct BigInter {
private:
    int num[50], len;
    int base;
public:     
    BigInter() {
        memset(num,0,sizeof(num));
        len = 1;
        base = 10000;
     }
    BigInter(int v) {
        memset(num,0,sizeof(num));
        base = 10000;
        len = 0;
        do {
        	num[++len] = v%base;
        	v /= base;
        }while(v);
    }
    BigInter operator=(int x) {
         return *this = BigInter(x);
    }
    BigInter operator=(long long x) {
         return *this = BigInter(x);
    }
    BigInter operator+(BigInter &b) {
         BigInter res;
         res.len = max(this->len, b.len);
         for(int i = 1; i <= res.len; i++) {
             res.num[i] += this->num[i] + b.num[i];
             res.num[i+1] += res.num[i]/base;
             res.num[i] = res.num[i]%base;
         }
         if(res.num[res.len+1]) res.len++;
         return res;
    }
     BigInter operator+(long long x) {
	     BigInter res;
	     BigInter b = BigInter(x);
	     res.len = max(this->len, b.len);
	     for(int i = 1; i <= res.len; i++) {
	         res.num[i] += this->num[i] + b.num[i];
	         res.num[i+1] += res.num[i]/base;
	         res.num[i] = res.num[i]%base;
	     }
	     if(res.num[res.len+1]) res.len++;
	     return res;
     }
     BigInter operator*(BigInter &b) {
        BigInter res;
        res.len = this->len+b.len;
        for(int i = 1; i <= this->len; i++) {
            for(int j = 1; j <= b.len; j++) {
            	res.num[j+i-1] += this->num[i] * b.num[j];
            	res.num[j+i] += res.num[j+i-1]/base;
            	res.num[j+i-1] %= base;
            }
        }
        while(!res.num[res.len]) res.len--;
        return res;
     }
     BigInter operator*(long long x) {
        BigInter res;
        BigInter b(x);
        res.len = this->len+b.len;
        for(int i = 1; i <= this->len; i++) {
            for(int j = 1; j <= b.len; j++) {
            	res.num[j+i-1] += this->num[i] * b.num[j];
            	res.num[j+i] += res.num[j+i-1]/base;
            	res.num[j+i-1] %= base;
            }
        }
        while(!res.num[res.len]) res.len--;
        return res;
     }
     void operator +=(BigInter &b) {
         *this = *this + b;
     }
     void operator *=(BigInter &b) {
         *this = *this * b;
     }
     void operator +=(long long x) {
         BigInter b = BigInter(x);
         *this = *this + b;
     }
     void operator *=(long long x) {
     	BigInter b = BigInter(x);
         *this = *this * b;
     }
     BigInter operator++() {
     	*this = *this+1;
     	return *this;
     }
     BigInter operator ++(int) {
     	BigInter old = *this;
     	++(*this);
     	return old;
     }
     void print() {
         printf("%d", num[len]);
         for(int i = len-1; i >= 1; i--) {
         	printf("%04d", this->num[i]);
         }
         puts("");
     }
};
全部评论

相关推荐

01-14 16:23
广州商学院 Java
双非后端失败第N人:如果准备好了可以直接投字节,字节是最不看学历的,只要想面,大概率都能给你约面。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务