返回主页

高精度减法

两个高精度数相减的普通实现(包括小减大)

课堂示例发布于 2026/09/12#高精度
C++42 行1057 Bytes
下载文件
#include<bits/stdc++.h>
using namespace std;
int main(){

    string a, b;
    cin >> a >> b;

    // 判断a和b的大小,如果a小的话就先输出一个负号,交换a,b
    if (a.size() < b.size() || (a.size() == b.size() && a < b)) {
        cout << '-';
        swap(a, b);
    } 

    //翻转对齐
    int a_len = a.size(),b_len = b.size();
    int a_digit[305] = {0},b_digit[305] = {0};
    for(int i=0,j=a_len-1;i<a_len;i++,j--) 
        a_digit[j] = a[i]-'0';
    for(int i=0,j=b_len-1;i<b_len;i++,j--) 
        b_digit[j] = b[i]-'0';
    
    //按位减
    int c_len = max(a_len,b_len);
    int c_digit[305] = {};
    for(int i=0;i<c_len;i++){
        c_digit[i] = a_digit[i] - b_digit[i];
    }

    //借位
    for(int i=0;i<c_len;i++){
        if (c_digit[i] < 0) {
            c_digit[i] += 10;
            c_digit[i+1]--;
        }
    }
    // 去除前导 0
    while (c_digit[c_len-1] == 0 && c_len > 1) c_len--;
    
    //逆序输出,从高位开始输出
    for(int i=c_len-1;i>=0;i--) cout<<c_digit[i];
    return 0;
}