C语言 大整数加法 该怎么解决?

c语言 大整数加法
数据很大,所以我用的long long,可是这样做结果差太多了。希望大家告诉我哪里错了,然后教一下这种类型的应该怎么做,谢谢。

img

img

img

大整数,用 long long 是不够200位的,需用字符数组写。
共参考:https://blog.csdn.net/Getugly/article/details/84670190

使用自定义的BigInt结构体来表示大整数

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

// 定义大整数的最大位数
#define MAX_DIGITS 200

// 大整数结构体
typedef struct {
    int digits[MAX_DIGITS];  // 每一位的数字
    int length;  // 大整数的位数
} BigInt;

// 初始化
void initBigInt(BigInt *num) {
    memset(num->digits, 0, sizeof(num->digits));
    num->length = 0;
}

// 读
void readBigInt(BigInt *num) {
    char str[MAX_DIGITS + 1];
    scanf("%s", str);
    num->length = strlen(str);
    for (int i = 0; i < num->length; i++) {
        num->digits[num->length - i - 1] = str[i] - '0';  // 从个位开始存储
    }
}

// 输出
void printBigInt(const BigInt *num) {
    for (int i = num->length - 1; i >= 0; i--) {
        printf("%d", num->digits[i]);
    }
    printf("\n");
}

// 大整数相加
BigInt addBigInt(const BigInt *num1, const BigInt *num2) {
    BigInt result;
    initBigInt(&result);
    int carry = 0;  // 进位
    int maxLen = num1->length > num2->length ? num1->length : num2->length;
    for (int i = 0; i < maxLen || carry > 0; i++) {
        int sum = carry;
        if (i < num1->length) {
            sum += num1->digits[i];
        }
        if (i < num2->length) {
            sum += num2->digits[i];
        }
        result.digits[result.length++] = sum % 10;
        carry = sum / 10;
    }
    return result;
}

int main() {
    BigInt num1, num2, result;
    initBigInt(&num1);
    initBigInt(&num2);
    initBigInt(&result);

    // 读取输入
    readBigInt(&num1);
    readBigInt(&num2);

    // 计算和
    result = addBigInt(&num1, &num2);
    // 输出结果
    printBigInt(&result);
    return 0;
}

C语言大整数加法_西城风雨楼的博客-CSDN博客 C语言实现大整数加法题目描述:1:大整数加法总时间限制: 1000ms 内存限制: 65536kB描述求两个不超过200位的非负整数的和。输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。样例输入22222222222222222222333333333333..._大整数加法 https://blog.csdn.net/xichengfengyulou/article/details/88711943?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E8%AF%AD%E8%A8%80%20%E5%A4%A7%E6%95%B4%E6%95%B0%E5%8A%A0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-88711943.142^v92^controlT0_1&spm=1018.2226.3001.4187

【以下回答由 GPT 生成】

问题分析

首先,我们需要明确一点,long long类型所能表示的整数范围是有限的,通常为-9,223,372,036,854,775,8089,223,372,036,854,775,807。如果所处理的整数超过了这个范围,就会导致溢出错误。

解决方案

为了解决大整数加法问题,可以考虑用字符串来表示整数,然后编写相应的函数来实现大整数的加法运算。

以下是一个示例解决方案:

  1. 首先,需要编写一个函数来计算两个字符串表示的大整数的和。该函数的输入参数为两个字符串,返回值为一个字符串,表示它们的和。

```c char addStrings(char num1, char num2) { int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 + 1 : len2 + 1; // 长度取两个字符串长度的较大值加1,为了给结果留出最后一个进位位 char result = (char*)malloc(sizeof(char) * len); result[len - 1] = '\0'; // 最后一位设置为字符串结束符

   int carry = 0;  // 进位
   int i = len1 - 1, j = len2 - 1, k = len - 2;  // ij分别指向num1和num2的最后一位k指向结果result的最后一位
   while (i >= 0 || j >= 0) {
       int digit1 = i >= 0 ? num1[i] - '0' : 0;  // 将字符转换为数字
       int digit2 = j >= 0 ? num2[j] - '0' : 0;
       int sum = digit1 + digit2 + carry;  // 当前位的和加上进位
       result[k] = sum % 10 + '0';  // 计算当前位的结果并将数字转换为字符
       carry = sum / 10;  // 计算进位
       i--;
       j--;
       k--;
   }

   if (carry > 0) {  // 如果最高位有进位要加上进位
       result[k] = carry + '0';
       return result;
   } else {  // 如果没有进位返回结果去掉开头的0
       char* res = (char*)malloc(sizeof(char) * (len - 1));
       memcpy(res, result + 1, sizeof(char) * (len - 1));
       free(result);
       return res;
   }

} ```

  1. 然后,可以调用上述函数来进行大整数加法运算。首先,将两个大整数分别存储为字符串,然后调用函数进行运算,最后输出结果。

```c #include

int main() { char num1[] = "123456789012345678901234567890"; char num2[] = "987654321098765432109876543210";

   char* result = addStrings(num1, num2);
   printf("Result: %s\n", result);
   free(result);

   return 0;

} ```

结果

以上解决方案可以帮助你解决大整数加法问题。你可以根据自己的实际需求调整代码。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^