高精度加法

#include <bits/stdc++.h>
using namespace std;
char ch1[1000 + 1], ch2[1000 + 1];
int arr1[1000 + 1], arr2[1000 + 1], sum[1000 + 1];
int main() {
    cin >> ch1;
    cin >> ch2;
    // 如果有加数为0
    if (ch1[0] == '0' && ch2[0] == '0') {
        cout << '0' << endl;
    } else if (ch1[0] == '0') {
        cout << ch2 << endl;
    } else if (ch2[0] == '0') {
        cout << ch1 << endl;
    } else { // 正常处理
        // 计算字符串长度
        int len1 = strlen(ch1);
        int len2 = strlen(ch2);
        // 倒序转入以便进位
        for (int i = 0; i < len1; i++) {
            arr1[len1 - i - 1] = int(ch1[i] - '0');
        }
        for (int i = 0; i < len2; i++) {
            arr2[len2 - i - 1] = int(ch2[i] - '0');
        }
        // 打擂台找字符串最大长度
        int maxLen = max(len1, len2);
        // 按位相加~
        for (int i = 0; i < maxLen; i++) {
            sum[i] += arr1[i] + arr2[i];
            // 考虑进位
            if (sum[i] >= 10) {
                sum[i + 1]++;
                sum[i] -= 10;
            }
        }
        if (sum[maxLen] == 0) {
            maxLen--;
        }
        for (int i = maxLen; i >= 0; i--) {
            cout << sum[i];
        }
        cout << endl;
    }
    return 0;
}

高精度减法

#include <bits/stdc++.h>
using namespace std;
char ch1[1000 + 1], ch2[1000 + 1], tmp[1000 + 1];
int arr1[1000 + 1], arr2[1000 + 1], diff[1000 + 1];
int main() {
    cin >> ch1;
    cin >> ch2;
    // 若两个数都为零
    if (ch1[0] == '0' && ch2[0] == '0') {
        cout << 0 << endl;
    // 若被减数为零
    } else if (ch1[0] == '0') {
        // 输出减数相反数(?
        if (ch2[0] == '-') {
            ch2[0] == ' ';
            cout << ch2 << endl;
        } else {
            cout << "-" << ch2 << endl;
        }
    // 如果减数为零直接输出被减数
    } else if (ch2[0] == '0') {
        cout << ch1 << endl;
    } else {
        // 正常处理
        // 字符串长度
        int len1 = strlen(ch1);
        int len2 = strlen(ch2);
        // 如果这两个数相等输出0
        if (len1 == len2 && strcmp(ch1, ch2) == 0) {
            cout << 0 << endl;
            return 0;
        }
        // 根据两个数的大小判断是否要加"-"并交换顺序
        if (len1 < len2 || len1 == len2 && strcmp(ch1, ch2) < 0) {
            // 交换位置~
            strcpy(tmp, ch1);
            strcpy(ch1, ch2);
            strcpy(ch2, tmp);
            cout << "-";
            // 交换长度
            int lentemp = len1;
            len1 = len2;
            len2 = lentemp;
        }
        // 倒序转入数组
        for (int i = 0; i < len1; i++) {
            arr1[len1 - i - 1] = int(ch1[i] - '0');
        }
        for (int i = 0; i < len2; i++) {
            arr2[len2 - i - 1] = int(ch2[i] - '0');
        }
        // 取得最大长度
        int maxLen = max(len1, len2);
        // 按位相减启动
        for (int i = 0; i < maxLen; i++) {
            if (arr1[i] < arr2[i]) {
                arr1[i + 1]--;
                arr1[i] += 10;
            }
            diff[i] = arr1[i] - arr2[i];
        }
        // 删除前导零
        while(diff[maxLen] == 0) {
            maxLen--;
        }
        // 输出差
        for (int i = maxLen; i >= 0; i--) {
            cout << diff[i];
        }
        cout << endl;
    }
    return 0;
}