高精度加法、减法、乘法【自存】

发布时间 2023-04-17 14:28:38作者: 从零开始的acm

预处理

int Max_len;     // 最多可能的位数

string a, b;

void init() {
    cin >> a >> b;
    Max_len = 500;     //
    int ind = Max_len, i = a.size() - 1;
    while(i >= 0) {
        ans[ind] = a[i] - '0';
        ind--; i--;
    }
    ind = Max_len, i = b.size() - 1;
    while(i >= 0) {
        tem[ind] = b[i] - '0';
        ind--; i--;
    }
    return;
}

高精度加法

void add(int a[], int b[]) {   
    int jw = 0;
    for(int i = Max_len; i >= 0; i--) {
        a[i] += jw + b[i];
        jw = a[i] / 10;
        a[i] %= 10;
    }
    return;
}

int main() {
    // init()
    add(ans, tem);
    bool f = 0;
    for(int i = 0; i <= Max_len; i++) {
        if(!f && (ans[i] || i == Max_len)) f = 1;
        if(f) 
            printf("%d", ans[i]);
    }puts("");
}

高精度减法

void sub(int a[], int b[]) {   // 
    int jw = 0;
    for(int i = Max_len; i >= 0; i--) {
        a[i] = a[i] + jw - b[i];
        if(a[i] < 0) {
            a[i] += 10;
            jw = -1;
        }
        else jw = 0;
    }
    return;
}

int main() {
    sub();
    bool f = 0;
    for(int i = 0; i <= Max_len; i++) {
        if(!f) {
            if(i == Max_len) {
                f = 1;
            }
            else if(ans[i]) {
                f = 1;
                if(fh) printf("-");     // fh : a < b 的 flag 
            }
        }
        if(f) 
            printf("%d", ans[i]);
    }puts("");
}

高精度乘法

// 高精 * 高精
void mul1(int a[], int b[], int c[]) {      // c = a * b
    for(int i = Max_len; i >= 0; i--) {     /// b[i] * 10^(Max_len - i)
        int jw = 0;
        int tem[N] = {};
        for(int j = Max_len; j >= (Max_len - i); j--) {   // a[j]
            tem[j - (Max_len - i)] = b[i] * a[j] + jw;
            jw = tem[j - (Max_len - i)] / 10;
            tem[j - (Max_len - i)] %= 10;
        }
        add(c, tem);
    }
}