• 华中科技大学机试大位数加法器C语言编程解答


    描述

    实现一个加法器,使其能够输出a+b的值。

    输入描述:

    输入包括两个数a和b,其中a和b的位数不超过1000位。

    输出描述:

    可能有多组测试数据,对于每组数据, 输出a+b的值。

    示例1

    输入:

    2 6
    10000000000000000000 10000000000000000000000000000000
    

    复制输出:

    8
    10000000000010000000000000000000

    答案1

    #include
    #include

    // 函数用于将字符串表示的数字转换为整数数组,倒序存储
    void str_to_int_array(char *str, int num[]) {
        int len = strlen(str);
        for (int i = 0; i < len; i++) {
            num[i] = str[len - 1 - i] - '0'; // 字符转换为数字
        }
    }

    // 函数用于将整数数组转换为字符串表示的数字
    void int_array_to_str(int num[], int len, char *str) {
        int i;
        for (i = len - 1; i >= 0; i--) {
            str[len - 1 - i] = num[i] + '0'; // 数字转换为字符
        }
        str[len] = '\0'; // 添加字符串结束符
    }

    // 函数用于计算两个大整数的和
    void add_large_numbers(char *a, char *b, char *result) {
        int num1[1005] = {0}, num2[1005] = {0}, sum[1006] = {0};
        int len1 = strlen(a), len2 = strlen(b);

        str_to_int_array(a, num1);
        str_to_int_array(b, num2);

        int carry = 0, i;
        int max_len = len1 > len2 ? len1 : len2;
        for (i = 0; i < max_len; i++) {
            int digit_sum = num1[i] + num2[i] + carry;
            sum[i] = digit_sum % 10;
            carry = digit_sum / 10;
        }
        if (carry > 0) {
            sum[i] = carry;
            max_len++;
        }

        int_array_to_str(sum, max_len, result);
    }

    int main() {
        char a[1005], b[1005], result[1006];
        while (scanf("%s %s", a, b) != EOF) {
            add_large_numbers(a, b, result);
            printf("%s\n", result);
        }
        return 0;
    }

    详解1

    1. str_to_int_array 函数:

      • 这个函数接受一个表示大整数的字符串和一个整数数组作为参数。
      • 函数的作用是将字符串表示的数字转换为整数数组,并且倒序存储。
      • 函数首先获取字符串的长度,并通过循环将每个字符转换为数字,存储到整数数组中,注意要将字符转换为数字需要减去字符 '0' 的 ASCII 码值。
    2. int_array_to_str 函数:

      • 这个函数接受一个整数数组和一个字符串作为参数。
      • 函数的作用是将整数数组转换为字符串表示的数字。
      • 函数通过循环将整数数组中的每个数字转换为字符,存储到字符串中,注意要将数字转换为字符需要加上字符 '0' 的 ASCII 码值,并且要注意字符串的结束符 '\0'。
    3. add_large_numbers 函数:

      • 这个函数接受两个表示大整数的字符串和一个保存结果的字符串作为参数。
      • 函数的作用是计算两个大整数的和。
      • 函数首先调用 str_to_int_array 函数将两个字符串转换为整数数组表示。
      • 然后通过循环逐位相加,并考虑进位的情况。
      • 最后调用 int_array_to_str 函数将结果转换为字符串表示,并保存到结果字符串中。
    4. main 函数:

      • 这个函数负责程序的主要逻辑。
      • 在一个循环中,不断从标准输入中读取两个表示大整数的字符串,并调用 add_large_numbers 函数计算它们的和,并将结果输出到标准输出中

    答案2 

    #include
    #include

    // 函数用于将两个字符串表示的大整数相加
    void add_large_numbers(char *a, char *b, char *result) {
        int len1 = strlen(a);
        int len2 = strlen(b);
        int carry = 0; // 进位标志

        // 从低位到高位依次相加
        for (int i = len1 - 1, j = len2 - 1, k = 0; i >= 0 || j >= 0 || carry > 0; i--, j--, k++) {
            int sum = carry;
            if (i >= 0) {
                sum += a[i] - '0';
            }
            if (j >= 0) {
                sum += b[j] - '0';
            }
            result[k] = sum % 10 + '0'; // 计算当前位的数字并转换为字符
            carry = sum / 10; // 更新进位
        }
        
        // 翻转结果字符串
        int len = strlen(result);
        for (int i = 0; i < len / 2; i++) {
            char temp = result[i];
            result[i] = result[len - 1 - i];
            result[len - 1 - i] = temp;
        }
    }

    int main() {
        char a[1001], b[1001], result[1002]; // result 长度应为最大长度 + 1,用于存储可能的进位
        while (scanf("%s %s", a, b) != EOF) {
            add_large_numbers(a, b, result);
            printf("%s\n", result);
        }
        return 0;
    }


    详解2

    1. 头文件包含

      • stdio.h 包含了输入输出函数 printfscanf
      • string.h 包含了字符串操作函数 strlen
    2. add_large_numbers 函数

      • 这个函数接受三个参数,分别是两个大整数的字符串表示 ab,以及保存结果的字符数组 result
      • 函数首先获取输入字符串 ab 的长度,以便后续循环遍历。
      • 然后使用一个循环从字符串的末尾开始逐位相加,同时处理进位,直到遍历完两个字符串的所有位数。
      • 在每一次循环中,先将当前位的数字与上一次的进位相加,并更新进位。然后将得到的结果取余 10,作为当前位的数字,并将其转换为字符存储到结果字符串中。
      • 循环结束后,结果字符串中的数字是逆序的,因此需要将其翻转得到正确的结果。
    3. main 函数

      • main 函数负责程序的主要逻辑。
      • 在一个循环中,不断从标准输入中读取两个字符串,作为两个大整数进行相加。
      • 每次调用 add_large_numbers 函数来计算它们的和,并将结果输出到标准输出中。
  • 相关阅读:
    http 请求405 错误
    Java Web3J :使用web3j监听、查询、订阅智能合约的事件
    js判断一个对象是否在一个对象数组中
    一文读懂Git原理及最佳实践
    MFC中Edit控件使用方法
    C语言 udp通信
    【10】使用Test类测试&ImGUI
    【速通指南】《信息资源管理》信息系统资源管理,第3章
    Java反射机制
    【IntelliJ IDEA】切换jdk版本配置
  • 原文地址:https://blog.csdn.net/wwwwwmmn/article/details/136216642