b)用整型数组表示10进制大整数(超过2^32的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。(C语言)
时间: 2024-02-12 10:09:50 浏览: 74
好的,针对您的问题,我提供以下的代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 10000 // 数组最大长度
#define BASE 10 // 进制数
// 大整数结构体
typedef struct {
int num[MAX_LEN]; // 存储每一位数字
int len; // 数组有效长度
} BigInt;
// 初始化大整数
void init(BigInt *a) {
memset(a->num, 0, sizeof(a->num)); // 数组全部清零
a->len = 0;
}
// 从字符串构造大整数
void fromStr(BigInt *a, char *str) {
init(a); // 初始化
int len = strlen(str);
for (int i = len - 1; i >= 0; i--) {
a->num[len - 1 - i] = str[i] - '0'; // 将字符转化为数字
}
a->len = len;
}
// 打印大整数
void print(BigInt *a) {
for (int i = a->len - 1; i >= 0; i--) {
printf("%d", a->num[i]);
}
printf("\n");
}
// 比较两个大整数大小
int cmp(BigInt *a, BigInt *b) {
if (a->len != b->len) { // 长度不同,直接比较长度
return a->len - b->len;
}
for (int i = a->len - 1; i >= 0; i--) { // 从高位到低位逐位比较
if (a->num[i] != b->num[i]) {
return a->num[i] - b->num[i];
}
}
return 0;
}
// 大整数加法
void add(BigInt *a, BigInt *b, BigInt *c) {
init(c); // 初始化
int carry = 0; // 进位
for (int i = 0; i < a->len || i < b->len; i++) { // 从低位到高位逐位相加
int sum = a->num[i] + b->num[i] + carry;
carry = sum / BASE; // 计算进位
c->num[i] = sum % BASE; // 计算当前位的值
c->len++; // 更新数组长度
}
if (carry) { // 如果最高位有进位
c->num[c->len++] = carry;
}
}
// 大整数减法
void sub(BigInt *a, BigInt *b, BigInt *c) {
init(c); // 初始化
int borrow = 0; // 借位
for (int i = 0; i < a->len || i < b->len; i++) { // 从低位到高位逐位相减
int diff = a->num[i] - b->num[i] - borrow;
borrow = 0; // 每次循环前先清零
if (diff < 0) { // 需要借位
diff += BASE;
borrow = 1;
}
c->num[i] = diff; // 计算当前位的值
if (c->num[i] != 0) { // 如果当前位不为0,则更新数组长度
c->len = i + 1;
}
}
}
int main() {
BigInt a, b, c;
char str1[MAX_LEN], str2[MAX_LEN];
printf("请输入第一个大整数:");
scanf("%s", str1);
fromStr(&a, str1);
printf("请输入第二个大整数:");
scanf("%s", str2);
fromStr(&b, str2);
add(&a, &b, &c);
printf("两数之和为:");
print(&c);
sub(&a, &b, &c);
printf("两数之差为:");
print(&c);
return 0;
}
```
这段代码可以通过输入两个超过2^32的整数,将它们存储在数组中,并实现大整数的加减法操作。需要注意的是,这里的进制数为10,因此数组中存储的是每一位数字,而不是每一位的二进制表示。
阅读全文