C语言两个较大数字相加

思路分析

由于C语言中的基本数据类型(如int、long等)有固定的大小,无法直接处理非常大的数字(如数百位的数字)。因此,我们需要采用字符串或数组来表示大数字,并逐位进行加法操作。具体思路如下:

  1. 输入处理:将两个大数字以字符串的形式输入,并将其反转,以方便从低位到高位进行逐位相加。
  2. 逐位相加:从低位到高位逐位相加,同时处理进位问题。如果两个数字长度不同,则在短数字的高位补0。
  3. 处理进位:如果最高位有进位,则在结果的最高位补1。
  4. 结果处理:将结果字符串反转,得到最终的大数字和结果。

示例代码

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

// 反转字符串函数
void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

// 大数相加函数
char* addLargeNumbers(const char *num1, const char *num2) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int maxLen = len1 > len2 ? len1 : len2;

    // 分配结果字符串,长度最多为 maxLen + 1(可能会有进位)
    char *result = (char *)malloc(maxLen + 2);
    memset(result, 0, maxLen + 2);

    // 反转输入字符串
    char n1[maxLen + 1], n2[maxLen + 1];
    strcpy(n1, num1);
    strcpy(n2, num2);
    reverse(n1);
    reverse(n2);

    // 补齐较短的数字
    for (int i = len1; i < maxLen; i++) n1[i] = '0';
    for (int i = len2; i < maxLen; i++) n2[i] = '0';

    int carry = 0;
    for (int i = 0; i < maxLen; i++) {
        int digit1 = n1[i] - '0';
        int digit2 = n2[i] - '0';
        int sum = digit1 + digit2 + carry;
        result[i] = (sum % 10) + '0';
        carry = sum / 10;
    }
    if (carry) result[maxLen] = carry + '0';

    // 反转结果字符串
    reverse(result);

    return result;
}

int main() {
    char num1[1000], num2[1000];
    printf("输入第一个大数: ");
    scanf("%s", num1);
    printf("输入第二个大数: ");
    scanf("%s", num2);

    char *sum = addLargeNumbers(num1, num2);
    printf("两个大数的和: %s\n", sum);

    free(sum);
    return 0;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部