【acm模板整理】c++高精度

注:本系列只为整理、保存比赛模板用,并非代码均为自己所写。会给出原代码的链接。

代码来源:kuangbin的代码 有改动

只有加、乘。。还要减的话还是java大法好

struct BigInt{
    int a[1005],len;
    const static int mod=10;
    BigInt(){
        memset(a,0,sizeof(a));
        len=1;
    }
    BigInt(int v){
        memset(a,0,sizeof(a));
        len=0;
        do{
            a[++len]=v%mod;
            v/=mod;
        }while(v);
    }
    bool friend operator < (const BigInt &a, const BigInt &b) {
		if(a.len < b.len) return 1;
		if(a.len > b.len) return 0;
		for(int i = a.len; i; --i) {
			if(a.a[i] < b.a[i]) return 1;
			if(a.a[i] > b.a[i]) return 0;
		}
		return 0;
	}
    BigInt operator +(const BigInt &b)const{
        BigInt res;
        res.len=max(len,b.len);
        for(int i=1;i<=res.len;i++)res.a[i]=0;
        for(int i=1;i<=res.len;i++){
            res.a[i]+=((i<=len?a[i]:0)+(i<=b.len?b.a[i]:0));
            res.a[i+1]+=res.a[i]/mod;
            res.a[i]%=mod;
        }
        if(res.a[res.len+1]>0)res.len++;
        return res;
    }
    BigInt operator *(const BigInt &b)const{
        BigInt res;
        for(int i=1;i<=len;i++){
            int up=0;
            for(int j=1;j<=b.len;j++){
                int tmp=a[i]*b.a[j]+res.a[i+j]+up;
                res.a[i+j]=tmp%mod;
                up=tmp%mod;
            }
        }
    }
    BigInt friend operator * (const BigInt &a, int t) {
		BigInt ret;
		ret.len=0;
		memset(ret.a,0,sizeof(ret.a));
		for(int i = 1; i <= a.len; ++i) ret.a[i] = a.a[i] * t;
		for(int i = 1; i <= a.len; ++i) {
			ret.a[i + 1] += ret.a[i] / mod;
			ret.a[i]%=mod;
		}
		ret.len=a.len;
		while(ret.a[ret.len+1]>0) {
			ret.a[ret.len+2]+=ret.a[ret.len+1]/mod;
			ret.a[ret.len+1]%=mod;
			++ret.len;
		}
		if(ret.a[ret.len+1]>0) ++ret.len;
		return ret;
	}
	void print() {
		for(int i=len;i;--i) printf("%d", a[i]);
	}
};

 

你可能感兴趣的:(模板整理)