C语言实现大整数运算:加减模运算

为了解决大整数的表示与运算溢出问题,我们可以将大整数先转换成二进制,再把二进制中的每一位,0 或 1,以'0'或'1'字符的形式,从低到高位依次存放到一个字符数组中,称为大数的二进制字符数组表示。

本文将使用C语言实现两个大整数的+-%等基本运算。

代码实现

/* 大整数加法 */
void add(char A[], char B[], char C[]) {
    int len1 = strlen(A), len2 = strlen(B);
    int len = max(len1, len2);
    int carry = 0; // 进位标志
    for (int i = 0; i < len; i++) {
        int a = i < len1 ? A[len1 - 1 - i] - '0' : 0;
        int b = i < len2 ? B[len2 - 1 - i] - '0' : 0;
        int sum = a + b + carry;
        C[len - 1 - i] = sum % 10 + '0';
        carry = sum / 10;
    }
    if (carry) C[0] = '1'; // 如果最高位有进位,需要在最高位加1
}

/* 大整数减法 */
int cmp(char A[], char B[]) {
    int len1 = strlen(A), len2 = strlen(B);
    if (len1 != len2) return len1 > len2 ? 1 : -1;
    for (int i = 0; i < len1; i++) {
        if (A[i] != B[i]) return A[i] > B[i] ? 1 : -1;
    }
    return 0;
}
void sub(char A[], char B[], char C[]) {
    int len1 = strlen(A), len2 = strlen(B);
    int len = max(len1, len2);
    if (cmp(A, B) < 0) { // 如果被减数小于减数,交换两者
        swap(A, B);
        putchar('-');
    }
    int borrow = 0; // 借位标志
    for (int i = 0; i < len; i++) {
        int a = i < len1 ? A[len1 - 1 - i] - '0' : 0;
        int b = i < len2 ? B[len2 - 1 - i] - '0' : 0;
        int diff = a - b - borrow;
        if (diff < 0) { // 如果需要借位
            diff += 10;
            borrow = 1;
        } else {
            borrow = 0;
        }
        C[len - 1 - i] = diff + '0';
    }
    while (len > 1 && C[0] == '0') len--; // 去掉前导零
    C[len] = '�';
}

/* 大整数取模 */
int mod(char A[], int b) {
    int res = 0; // 余数
    int len = strlen(A);
    for (int i = 0; i < len; i++) {
        res = res * 10 + A[i] - '0';
        res %= b;
    }
    return res;
}

代码解析

  1. 大整数加法 add() 函数

    • 该函数实现两个大整数的加法运算,并存储在 C 数组中。
    • 使用 carry 变量记录进位,从低位到高位进行逐位相加。
    • 若最高位有进位,则需要在最高位加 1。
  2. 大整数减法 sub() 函数

    • 该函数实现两个大整数的减法运算,并存储在 C 数组中。
    • 首先使用 cmp() 函数比较两个大整数的大小,若被减数小于减数,则交换两者并输出负号。
    • 使用 borrow 变量记录借位,从低位到高位进行逐位相减。
    • 若需要借位,则当前位加 10,并将借位标志设为 1。
    • 最后,去除前导零。
  3. 大整数取模 mod() 函数

    • 该函数实现大整数对一个整数的取模运算。
    • 使用 res 变量记录余数,从低位到高位进行逐位计算。
    • 每次计算将当前位的值加入到 res 中,并对 b 取模。

总结

本文介绍了使用C语言实现大整数加减模运算的方法,通过将大整数转换为二进制字符数组,避免了整数溢出问题,并提供了详细的代码实现和注释。

注意: 上述代码仅供参考,具体的实现方式可能需要根据实际情况进行调整。

C语言实现大整数运算:加减模运算

原文地址: https://www.cveoy.top/t/topic/nJ31 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录