C语言实现大数减法

当需要进行超出基本数据类型表示范围的减法运算时,就需要使用大数减法。本文将为您提供一份C语言实现的大数减法代码,并附带详细的代码解释。

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

// 辅助函数:反转字符串
void reverse_string(char* str) {
    int i = 0;
    int j = strlen(str) - 1;

    while (i < j) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
        i++;
        j--;
    }
}

// 大数减法函数
char* subtract_large_numbers(char* num1, char* num2) {
    int length1 = strlen(num1);
    int length2 = strlen(num2);
    int max_length = (length1 > length2) ? length1 : length2;

    int result[max_length + 1]; // 存储计算结果的数组
    memset(result, 0, sizeof(result));

    reverse_string(num1);
    reverse_string(num2);

    int carry = 0; // 初始化借位为0

    // 从个位数开始逐位相减
    for (int i = 0; i < max_length; i++) {
        int digit1 = (i < length1) ? (num1[i] - '0') : 0;
        int digit2 = (i < length2) ? (num2[i] - '0') : 0;

        int diff = digit1 - digit2 - carry;

        // 如果差值小于0,则需要向高位借位
        if (diff < 0) {
            diff += 10;
            carry = 1; // 设置借位标志为1
        } else {
            carry = 0; // 清除借位标志
        }

        result[i] = diff;
    }

    // 清除结果中的前导零
    int leading_zeros = 0;
    for (int i = max_length - 1; i >= 0; i--) {
        if (result[i] == 0) {
            leading_zeros++;
        } else {
            break;
        }
    }

    // 构造结果字符串
    char* result_str = malloc((max_length - leading_zeros + 1) * sizeof(char));
    for (int i = 0; i < max_length - leading_zeros; i++) {
        result_str[i] = result[i] + '0';
    }
    result_str[max_length - leading_zeros] = '�';

    reverse_string(result_str);

    return result_str;
}

int main() {
    char num1[] = '123456789';
    char num2[] = '987654321';

    char* result = subtract_large_numbers(num1, num2);

    printf('Result: %s\n', result);

    free(result);
    return 0;
}

代码解释:

  1. reverse_string(char* str) 函数:

    • 接受一个字符串作为参数,并将其反转。
    • 使用两个指针 ij 分别指向字符串的开头和结尾,逐个交换字符,直到 ij 交叉。
  2. subtract_large_numbers(char* num1, char* num2) 函数:

    • 接受两个表示大数的字符串作为参数,返回它们的差值。
    • 首先,计算两个字符串的长度,并取最大长度作为结果数组 result 的大小。
    • 然后,反转两个字符串,以便从个位数开始进行减法运算。
    • 定义一个 carry 变量来存储借位信息,初始化为0。
    • 使用一个循环从个位数开始逐位相减,并将每一位的差值存储在 result 数组中。
      • 如果某一位的差值小于0,则需要向高位借位,并将 carry 设置为1。
      • 否则,将 carry 清除为0。
    • 计算完成后,清除结果数组中的前导零。
    • 最后,将结果数组转换为字符串,并反转字符串使其恢复正常顺序。
  3. main() 函数:

    • 定义两个字符串 num1num2,分别表示要进行减法运算的两个大数。
    • 调用 subtract_large_numbers 函数进行减法计算,并将结果存储在 result 指针中。
    • 打印结果字符串 result
    • 释放 result 指针所指向的内存空间。

示例:

main 函数中,我们定义了两个大数 num1 = '123456789'num2 = '987654321'

程序运行后,将输出以下结果:

Result: -864197532

这表明 num1 减去 num2 的结果为 -864197532

C语言大数减法代码详解

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

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