高精度模板

本文介绍了一种使用C++结构体实现大整数加法、乘法及自增操作的方法。通过定义BigInter结构体,支持两个大整数之间的加法、乘法,以及大整数与整数之间的加法、乘法等操作。该实现利用数组存储大整数的每一位,并采用基底方法简化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

持续更新—
目前支持两个类相加相乘,类加乘整数,++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("");
     }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值