您的位置:

c++高精度减法详解

一、高精度减法代码

高精度减法是指两个大数相减,其中至少有一个数字长度超过 long long 类型所能表示的上限。以下是一个高精度减法的 c++ 代码示例:

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

const int MAXN = 10010;

int a[MAXN], b[MAXN], c[MAXN]; // a - b = c
int lena, lenb, lenc;

void print() {
     // 输出结果
    if (lenc == 0) printf("0");
    for (int i = lenc - 1; i >= 0; i--) {
        printf("%d", c[i]);
    }
    printf("\n");
}

bool cmp(int *a, int *b, int lena, int lenb) {
    if (lena != lenb) return lena < lenb;
    for (int i = lena - 1; i >= 0; i--) {
        if (a[i] != b[i]) return a[i] < b[i];
    }
    return true;
}

void sub(int *a, int *b, int *c, int lena, int lenb) {
    int borrow = 0;
    for (int i = 0; i < lena; i++) {
        c[i] = a[i] - borrow - b[i];
        if (c[i] < 0) {
            c[i] += 10;
            borrow = 1; 
        } else {
            borrow = 0;
        }
    }
    while (lenc > 0 && c[lenc - 1] == 0) lenc--;
}

int main() {
    // 读入两个大数
    string sa, sb;
    cin >> sa >> sb;
    lena = sa.length();
    lenb = sb.length();
    for (int i = 0; i < lena; i++) a[i] = sa[lena - i - 1] - '0';
    for (int i = 0; i < lenb; i++) b[i] = sb[lenb - i - 1] - '0';
    if (cmp(a, b, lena, lenb)) swap(a, b), swap(lena, lenb), printf("-");
    lenc = lena;
    sub(a, b, c, lena, lenb);
    print();

    return 0;
}

二、c++高精度减法

高精度减法需要注意以下几个问题:

1. 高精度减法需要将字符串转化为数字数组,方便进行计算。

2. 减法操作中需要判断被减数是否小于减数,以确定结果的正负。

3. 在计算的过程中,需要用一个借位值来判断是否需要借位。

4. 计算结束后需要去掉前导 0。

三、选取高精度减法C语言

C 语言中实现高精度减法需要手动实现字符串转数值和数值转字符串,相对比 c++ 更加繁琐。以下是高精度减法的 C 语言代码示例:

#include <stdio.h>
#include <string.h>

#define MAXN 10010

int a[MAXN], b[MAXN], c[MAXN]; // a - b = c
int lena, lenb, lenc;

void print() {
    // 输出结果
    if (lenc == 0) printf("0");
    for (int i = lenc - 1; i >= 0; i--) {
        printf("%d", c[i]);
    }
    printf("\n");
}

bool cmp(int* a, int* b, int lena, int lenb) {
    if (lena != lenb) return lena < lenb;
    for (int i = lena - 1; i >= 0; i--) {
        if (a[i] != b[i]) return a[i] < b[i];
    }
    return true;
}

void sub(int* a, int* b, int* c, int lena, int lenb) {
    int borrow = 0;
    for (int i = 0; i < lena; i++) {
        c[i] = a[i] - borrow - b[i];
        if (c[i] < 0) {
            c[i] += 10;
            borrow = 1; 
        } else {
            borrow = 0;
        }
    }
    while (lenc > 0 && c[lenc - 1] == 0) lenc--;
}

void str2int(char* str, int* x, int& len) {
    len = strlen(str);
    for (int i = 0; i < len; i++) {
        x[i] = str[len - 1 - i] - '0';
    }
}

void int2str(int* x, int len, char* str) {
    int pos = 0;
    for (int i = len - 1; i >= 0; i--) {
        str[pos++] = x[i] + '0';
    }
    str[pos] = '\0';
}

int main() {
    // 读入两个大数
    char sa[MAXN], sb[MAXN];
    scanf("%s%s", sa, sb);
    str2int(sa, a, lena);
    str2int(sb, b, lenb);
    if (cmp(a, b, lena, lenb)) {
        memcpy(c, b, sizeof(b));
        memcpy(b, a, sizeof(a));
        memcpy(a, c, sizeof(c));
        int tmp = lenb;
        lenb = lena;
        lena = tmp;
        printf("-");
    }
    lenc = lena;
    sub(a, b, c, lena, lenb);
    int2str(c, lenc, sa);
    printf("%s\n", sa);

    return 0;
}