天天看點

高精度系列——反正高精除高精我不會

高精度小貼士:

除法/減法從最高位開始,乘法/加法從最低位開始;

高精度的實質是模拟,注意邊界/進位/退位等等。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char s1[], s2[];
int x, lenf, leng, f[], g[], temp[]; //f[1]存個位 

void add() {//如果是單精就搞成高精>~<我不管我不管!! 
    scanf("%s", s1);
    scanf("%s", s2);
    lenf = strlen(s1);
    for(int i = ; i < lenf; i ++)
        f[lenf - i] = s1[i] - '0';
    leng = strlen(s2);
    for(int i = ; i < leng; i ++)
        g[leng - i] = s2[i] - '0'; 
    int len = max(lenf, leng);
    for(int i = ; i <= len; i ++) {
        if(f[i] + g[i] > ) f[i + ] ++;
        f[i] = (f[i] + g[i]) % ;
    }
    if(f[len + ]) len ++;
    for(int i = len; i >= ; i --) printf("%d", f[i]);
}

void mul() { //高精乘單精 
    scanf("%s", s1);
    scanf("%d", &x);
    lenf = strlen(s1);
    for(int i = ; i < lenf; i ++)
        f[lenf - i] = s1[i] - '0', f[lenf - i] *= x;
    for(int i = ; i <= lenf; i ++) {
        if(f[i] > )
            f[i + ] += f[i] / , f[i] %= ;
    }
    while(f[lenf + ]) {
        lenf ++;
        f[lenf + ] += f[lenf] / ; f[lenf] %= ;
    }
    for(int i = lenf; i >= ; i --) printf("%d", f[i]);
}

void big_mul() { //高精乘高精 
    scanf("%s", s1);
    scanf("%s", s2);
    lenf = strlen(s1);
    for(int i = ; i < lenf; i ++)
        f[lenf - i - ] = s1[i] - '0';
    leng = strlen(s2);
    for(int i = ; i < leng; i ++)
        g[leng - i - ] = s2[i] - '0'; 
    int mmax = , len = ;
    for(int i = ; i < lenf; i ++)
        for(int j = ; j < leng; j ++) {
            temp[i + j - ] += f[i] * g[j];
            if(temp[i + j - ]) mmax = i + j - ;
        }
    for(int i = ; i <= mmax + ; i ++) {
        temp[i + ] += temp[i] / ;
        temp[i] %= ;
        if(temp[i]) len = i;
    }
    for(int i = len; i >= ; i --) printf("%d", temp[i]);
}

void div() {//高精除單精 
    scanf("%s", s1);
    scanf("%d", &x);
    lenf = strlen(s1);
    for(int i = ; i < lenf; i ++)
        f[lenf - i] = s1[i] - '0';
    int mod = ;
    for(int i = lenf; i >= ; i --) {
        temp[i] = (f[i] + mod * ) / x;
        mod = (f[i] + mod * ) % x;
    }
    int i = lenf;
    for(; !temp[i]; i --);
    for(; i; i --) printf("%d", temp[i]);
}

int main() {
    add(); mul(); big_mul(); div();
    return ;
}