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

本文详细描述了一个程序,它实现了一个功能强大的大整数加法器,通过字符串转换为整数数组进行逐位相加,并处理进位。主要涉及str_to_int_array、int_array_to_str和add_large_numbers等关键函数。
摘要由CSDN通过智能技术生成

描述

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

输入描述:

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

输出描述:

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

示例1

输入:

2 6
10000000000000000000 10000000000000000000000000000000

复制输出:

8
10000000000010000000000000000000

答案1

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

// 函数用于将字符串表示的数字转换为整数数组,倒序存储
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 <stdio.h>
#include <string.h>

// 函数用于将两个字符串表示的大整数相加
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 函数来计算它们的和,并将结果输出到标准输出中。
  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多宝气泡水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值