c语言 大整数加法
数据很大,所以我用的long long,可是这样做结果差太多了。希望大家告诉我哪里错了,然后教一下这种类型的应该怎么做,谢谢。
大整数,用 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;
}
【以下回答由 GPT 生成】
首先,我们需要明确一点,long long
类型所能表示的整数范围是有限的,通常为-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
。如果所处理的整数超过了这个范围,就会导致溢出错误。
为了解决大整数加法问题,可以考虑用字符串来表示整数,然后编写相应的函数来实现大整数的加法运算。
以下是一个示例解决方案:
```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; // i、j分别指向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;
}
} ```
```c #include
int main() { char num1[] = "123456789012345678901234567890"; char num2[] = "987654321098765432109876543210";
char* result = addStrings(num1, num2);
printf("Result: %s\n", result);
free(result);
return 0;
} ```
以上解决方案可以帮助你解决大整数加法问题。你可以根据自己的实际需求调整代码。
【相关推荐】