用c语言编写一个实现两个大数(long也无法存储)相加相减相乘的函数,并逐行注释
时间: 2024-12-22 09:11:39 浏览: 8
在C语言中,由于`long long`类型可以存储更大的数值,我们可以使用这个类型来处理两个"大数"的相加、相减和相乘。但是,对于非常大的数,直接操作可能会导致溢出。这里我们将使用字符串作为数据结构,然后通过字符数组操作来模拟大数的运算。下面是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h> // 引入内存管理库
// 定义大数结构体,包含指向字符数组的指针和长度
typedef struct {
char* digits; // 存储数字的字符数组
int length; // 数字的位数
} BigInt;
// 初始化一个空的大数
BigInt initBigInt() {
BigInt num;
num.digits = (char*)malloc(sizeof(char));
num.length = 0;
return num;
}
// 添加一位数字到当前数
void addDigit(BigInt* num, char digit) {
num->digits = realloc(num->digits, sizeof(char) * (num->length + 2)); // 增加空间
num->digits[num->length] = digit - '0'; // 转换为整数并添加
num->digits[num->length + 1] = '\0';
num->length++;
}
// 拼接两个大数
void mergeBigInts(BigInt* a, BigInt* b, BigInt* result) {
while (a->length > 0 || b->length > 0) { // 当其中一个数非零时继续
char carry = 0;
if (b->length > 0) {
carry += b->digits[b->length - 1] - '0';
b->length--;
}
if (a->length > 0) {
carry += a->digits[a->length - 1] - '0';
a->length--;
}
addDigit(result, carry % 10 + '0'); // 将进位存入结果
}
result->digits[numeros->length] = '\0'; // 结尾补0
}
// 相加
void bigAdd(BigInt* a, BigInt* b, BigInt* result) {
result = initBigInt(); // 初始化结果
mergeBigInts(a, b, result);
}
// 相减
void bigSubtract(BigInt* a, BigInt* b, BigInt* result) {
result = initBigInt();
if (b->length > a->length) { // 如果b比a大,则交换a和b
BigInt temp;
temp = *a;
a = *b;
b = &temp;
}
for (int i = 0; i < a->length; ++i) {
int diff = a->digits[i] - '0' - b->digits[i] + '0'; // 计算差值
addDigit(result, diff); // 把差值加入结果
}
// 可能需要借位
for (int i = 0; i < b->length; ++i) {
int borrow = 10 - b->digits[i] + '0'; // 借位的值
diff = borrow - result->digits[result->length - 1]; // 更新差值
result->length--; // 减少结果的位数
addDigit(result, diff); // 更新结果
}
}
// 相乘
void bigMultiply(BigInt* a, BigInt* b, BigInt* result) {
result = initBigInt();
for (int i = 0; i <= a->length; ++i) { // 遍历a的每一位
BigInt partialResult = initBigInt(); // 初始化部分乘积
int multiplier = a->digits[i] - '0'; // 当前位的值
for (int j = 0; j <= b->length; ++j) { // 遍历b的每一位
int product = multiplier * b->digits[j] - '0'; // 乘积计算
addDigit(partialResult, product); // 加入部分乘积
}
// 将部分乘积加到结果上
mergeBigInts(partialResult, result, result);
}
}
// 打印大数
void printBigInt(BigInt num) {
printf("%.*s\n", num.length, num.digits);
}
int main() {
BigInt a = {"12345678901234567890"};
BigInt b = {"98765432109876543210"};
BigInt result;
bigAdd(&a, &b, &result);
printBigInt(result);
// 类似地,你可以创建bigSubtract和bigMultiply函数实例
return 0;
}
```
阅读全文