大整数模版

高精度模版:

稍加整合

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
const int N = 2007;
struct BigNum{
    int num[N];
    int op;
    int size;
    BigNum(){
        size=1, op=1;
        memset(num, false, sizeof(num));
    }
    void Cin(){
        char s[N];
        scanf("%s", s);
        size = strlen(s);
        for(int i=0,k=size-1;i<size;++i){
            if(s[i]=='-'){
                k--;
                op = -1;
            }else{
                num[k--] = s[i] - '0';
            }
        }
        if(op == -1){
            size--;
        }
    }
    void GetText(int n){
        size = log10(n)+1;
        for(int i=0; i<size;++i){
            num[i] = n % 10;
            n /= 10;
        }
    }
    bool operator <= (const BigNum &b)const{
        if(size > b.size)return false;
        if(size < b.size)return true;
        for(int i=size-1; i>=0;--i){
            if(num[i] > b.num[i])return false;
            if(num[i] < b.num[i])return true;
        }
        return true;
    }
    void operator = (const BigNum &b){
        size = b.size, op=b.op;
        for(int i=0; i<b.size; i++){
            num[i] = b.num[i];
        }
    }
    void operator = (const int &b){
        int x = b;
        if(x < 0){
            op = -1;
            x = -x;
        }
        size = 0;
        do{
            num[size++] = x % 10;
            x /= 10;
        }
        while(x);
    }
    BigNum operator * (const BigNum &b)const{
        BigNum res;
        res.op = b.op * op;
        res.size = size + b.size - 1;
        for(int i=0; i<b.size; i++){
            for(int j=0; j<size; j++){
                res.num[i+j] += num[j] * b.num[i];
            }
        }
        res.CarryBit();
        return res;
    }
    BigNum operator * (const int &b)const{
        int x = b;
        BigNum res;
        res.size = size;
        if(x < 0){
            res.op = res.op * -1;
            x = -x;
        }
        for(int i=0; i<size; i++){
            res.num[i] = num[i] * x;
        }
        res.CarryBit();
        return res;
    }
    friend BigNum operator + (BigNum a, BigNum b){
        BigNum res;
        if(a.op != b.op){
            res = a - b;
            b.op = b.op * -1;
        }else{
            res.op = a.op;
            res.size = max(a.size, b.size);
            for(int i=0; i<res.size; i++){
                res.num[i] = a.num[i] + b.num[i];
            }
            res.CarryBit();
        }

        return res;
    }
    friend BigNum operator + (BigNum a, int b){
        BigNum res;
        res = b;
        res = res + a;
        return res;
    }
    friend BigNum operator - (BigNum a, BigNum b){
        BigNum res;
        b.op = b.op * -1;
        if(a.op == b.op){
            res = a + b;
        }else{
            if(a <= b)swap(a,b);
            res.size = a.size;
            res.op = a.op;
            for(int i=0; i<res.size; i++){
                if(i < b.size){
                    res.num[i] = a.num[i] - b.num[i];
                }else{
                    res.num[i] = a.num[i];
                }
            }
            res.BorrowBit();
        }
        return res;
    }
    friend BigNum operator - (BigNum a, int b){
        BigNum res;
        res = b;
        res = a - res;
        return res;
    }
    friend BigNum operator ^(const BigNum &_a, const int &_m){
        BigNum result, a=_a;
        result.num[0] = 1;
        int m = _m;
        while(m){
            if(m & 1){
                result = result * a;
            }
            a = a * a;
            m >>= 1;
        }
        return result;
    }
    BigNum operator <<(const int &k)const{
        BigNum tmp;
        for(int i=size-1; i>=0; i--){
            tmp.num[i+k] = num[i];
        }
        tmp.size = size + k;
        tmp.CarryBit();
        return tmp;
    }
    void CarryBit(){
        for(int i=0; i<size; i++){
            if(num[i] >= 10){
                if(i+1==size){
                    num[i+1] = 0;
                    size += 1;
                }
                num[i+1] += num[i]/10;
                num[i] %= 10;
            }
        }
        while(size > 1 && !num[size-1]){
            size--;
        }
        if(size == 1 && !num[0]){
            op = 1;
        }
    }
    void BorrowBit(){
        for(int i=0; i<size; i++){
            if(num[i] < 0){
                num[i] += 10;
                num[i+1] -= 1;
            }
        }
        while(size > 1 && !num[size-1]){
            size--;
        }
        if(size == 1 && !num[0]){
            op = 1;
        }
    }
    void Out(){
        if(op == -1)
            printf("-");
        for(int i=size-1; i>=0; i--)
            printf("%d", num[i]);
        printf("\n");
    }
};
int Find(const BigNum &a, BigNum &Mod){
    int i;
    BigNum t;

    for(i=1; i<=9; i++){
        t = (((a*2)<<1)+i) * i;
        if(t <= Mod){
            continue;
        }
        break;
    }
    i--;
    t = (((a*2)<<1)+i) * i;
    Mod = Mod - t;
    return i;
}
BigNum Sqrt(const BigNum &a){
    BigNum ans, Mod;
    int len=a.size-1;
    if(a.size % 2 == 0){
        Mod = Mod + (a.num[len]*10+a.num[len-1]);
        len -= 2;
    }else{
        Mod = Mod + a.num[len];
        len -= 1;
    }
    ans = Find(ans, Mod);
    while(len > 0){
        Mod = (Mod<<2) + (a.num[len]*10+a.num[len-1]);
        ans = (ans<<1) + Find(ans, Mod);
        len -= 2;
    }
    return ans;
}


鸣谢出处:传送门

猜你喜欢

转载自blog.csdn.net/qq_39599067/article/details/80753523