题解:洛谷 P2142 高精度减法

【题目来源】

洛谷:P2142 高精度减法 - 洛谷

【题目描述】

高精度减法。

【输入】

两个整数 \(a,b\)(第二个可能比第一个大)。

【输出】

结果(是负数要输出负号)。

【输入样例】

2
1

【输出样例】

1

【算法标签】

《洛谷 P2142 高精度减法》 #模拟# #字符串# #高精度# #洛谷原创#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;  // 定义数组的最大长度
int A[N], B[N], C[N];  // A和B用于存储输入的两个大数,C用于存储结果
int la, lb, lc;        // la, lb分别表示A和B的长度,lc表示结果C的长度
string a, b;           // 用于存储输入的两个大数的字符串形式

// 比较函数,用于比较两个大数的大小
bool cmp(int A[], int B[])
{
    if (la != lb) return la > lb;  // 如果长度不同,直接比较长度
    for (int i = la - 1; i >= 0; i--)  // 从最高位开始逐位比较
        if (A[i] != B[i])
            return A[i] > B[i];  // 如果某一位不同,返回比较结果
    return true;  // 如果所有位都相同,返回true,避免结果为-0
}

// 大数减法函数,计算A - B,结果存储在C中
void sub(int A[], int B[], int C[])
{
    for (int i = 0; i < lc; i++) {
        if (A[i] < B[i]) {
            A[i + 1]--;  // 借位
            A[i] += 10;  // 当前位加10
        }
        C[i] = A[i] - B[i];  // 计算当前位的差值并存储在C中
    }
    while (lc && C[lc] == 0) lc--;  // 去掉结果中的前导0
}

int main()
{
    cin >> a >> b;  // 输入两个大数
    la = a.size(), lb = b.size(), lc = max(la, lb);  // 计算长度

    // 将字符串形式的大数转换为数组形式,并逆序存储(方便计算)
    for (int i = la - 1; i >= 0; i--) 
        A[la - 1 - i] = a[i] - '0';
    for (int i = lb - 1; i >= 0; i--)
        B[lb - 1 - i] = b[i] - '0';

    // 如果A小于B,交换A和B,并输出负号
    if (!cmp(A, B)) {
        swap(A, B);
        cout << '-';
    }

    // 执行减法操作
    sub(A, B, C);

    // 输出结果
    for (int i = lc; i >= 0; i--)
        cout << C[i];

    return 0;
}
#include <bits/stdc++.h>
using namespace std;

string a, b;          // 用于存储输入的两个大数的字符串形式
vector<int> A, B;     // 使用vector存储大数的每一位,方便动态调整大小

// 比较函数,用于比较两个大数的大小
bool cmp(vector<int> &A, vector<int> &B)
{
    if (A.size() != B.size()) return A.size() > B.size();  // 如果长度不同,直接比较长度
    for (int i = A.size() - 1; i >= 0; i--)               // 从最高位开始逐位比较
        if (A[i] != B[i])
            return A[i] > B[i];  // 如果某一位不同,返回比较结果
    return true;  // 如果所有位都相同,返回true
}

// 大数减法函数,计算 A - B,结果存储在 C 中
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;  // 用于存储结果
    for (int i = 0, t = 0; i < A.size(); i++)  // t 表示借位
    {
        t = A[i] - t;  // 先减去借位
        if (i < B.size()) t -= B[i];  // 如果 B 还有位数,减去 B 的当前位
        C.push_back((t + 10) % 10);  // 将当前位的差值存入 C(处理负数情况)
        if (t < 0) t = 1;  // 如果差值为负,需要借位
        else t = 0;        // 否则不需要借位
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();  // 去掉结果中的前导0
    return C;
}

int main()
{
    cin >> a >> b;  // 输入两个大数

    // 将字符串形式的大数转换为vector,并逆序存储(方便计算)
    for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

    // 比较 A 和 B 的大小
    if (cmp(A, B))  // 如果 A >= B
    {
        auto C = sub(A, B);  // 计算 A - B
        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];  // 输出结果
    }
    else  // 如果 A < B
    {
        auto C = sub(B, A);  // 计算 B - A
        cout << "-";         // 输出负号
        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];  // 输出结果
    }
    return 0;
}

【运行结果】

2
1
1
posted @ 2026-03-14 14:30  团爸讲算法  阅读(0)  评论(0)    收藏  举报