高精度加法

vector<int> u; //储存a倒序的每个数
vector<int> v; //储存b倒序的每个数
vector<int> add(vector<int> m, vector<int> n) {//高精度加法
    vector<int> temp;//temp数组存储相加后的每个数
    int t=0;//t作为每个数相加的和
    for (int i = 0; i < m.size() || i < n.size(); i++) {//遍历u,v数组
        if (i < m.size()) t += m[i];
        if (i < n.size()) t += n[i];
        temp.push_back(t % 10);//向temp尾部中塞入每个数相加后的最后一位
        t /= 10;//计算进位值存入下一位的计算
    }
    if (t > 0) {//当最后两个数相加后仍需要进位
        temp.push_back(1);//向temp尾部塞入1
    }
    return temp;
}

int main() {
    string a, b;
    cin >> a >> b;
    /*例:a=123456,b=123456*/
    for (int i = a.size() - 1; i >=0; i--) u.push_back(a[i] - '0');//将字符串形式的a,b转换为int十进制形式
    for (int i = b.size() - 1; i >=0; i--) v.push_back(b[i] - '0');
    //从a,b最后一位开始读取,逐个塞入u,v的尾部
    /*例:u=654321,v=654321*/
    vector<int> c = add(u, v);
    for (int i = c.size() - 1; i >= 0; i--) printf("%d", c[i]);//计算后再次倒序输出c
    /*例:c=219642,输出246912为最后答案*/
    return 0;
}

模拟竖式计算过程,重点在倒序相加,便于计算机处理
调用函数时传入引用,直接对 $u,v$ 进行操作,降低函数复制值的常数


高精度减法

vector<int>u, v;

bool cmp(vector<int> &u, vector<int> &v) {//比较两个数大小
    if (u.size() != v.size()) //前数不等于后数
        return u.size() > v.size();//返回前数是否大于后数,是=ture,否=false
    else for (int i = u.size()-1; i >=0; i--) //前数等于后数,遍历数组
            if (u[i] != v[i])//从高位开始比较,如果值不同
                return u[i] > v[i];//返回前值是否大于后值,是=ture,否=false
    return 1;//两个数完全相等,返回1或0都行
}

vector<int> sub(vector<int>& u, vector<int>& v) {//高精度减法
    vector<int> temp;//声明数组存储差值
    for (int i = 0, t = 0; i < u.size(); i++) {//以最大数的位数开始遍历,声明定义t作为最大数的每一位的值
        t = u[i] - t;//t为最大数当前i位的值减去上一轮借位的值
        if (i < v.size())t -= v[i];//当最大数的i位小于最小数的最低位数时,执行两个数的第i位做差
        temp.push_back((t + 10) % 10);//给temp数组末尾塞入做差后的值
        /*(t + 10) % 10 一石二鸟,当差值t大于0时取对10的余数,差值小于0时,加10就大于0,再对10取余
        两种情况都能取得t的最后一位的值,塞入temp的末尾*/
        if (t < 0) t = 1;//t小于0时,则借位到下一轮的t
        else t = 0;//不借位,将t初始化为0,进入下一轮
    }
    while (temp.size() > 1 && temp.back() == 0) temp.pop_back();//若有前导0,则循环清除前导0
    return temp;//返回数组
}


int main() {
    string a, b;
    cin >> a >> b;
    for (int i = a.size() - 1; i >= 0; i--) u.push_back(a[i] - '0');//倒序读入数组
    for (int i = b.size() - 1; i >= 0; i--) v.push_back(b[i] - '0');
    if (cmp(u, v)) {//比较两个数大小,分类讨论
        vector<int> c = sub(u, v);
        for (int i = c.size() - 1; i >= 0; i--) printf("%d", c[i]);
    }
    else
    {
        vector<int>c = sub(v, u);
        printf("-");//小数减大数,添加负号
        for (int i = c.size() - 1; i >= 0; i -- ) printf("%d", c[i]);
    }
    return 0;
}