C++用链表实现大整数加减法操作: 32 位机器直接操作的数据最大为 32 个 bit,若超过 32bit,则需要单独设计算法。在这 里,可以用链表每个结点存储大整数的每一位的十进制数字,则可以进行大整数的算数运算, 该实验仅实现加减法操作。 要求: 1, 随机产生 2 个 1~50 位的数字串,并存储到 2 个链表中。 2, 进行加法或减法操作,结果存储到新的链表中。 3, 打印运算结果。
时间: 2023-05-26 22:04:49 浏览: 242
本题需要使用链表来存储大整数,其中每个结点存储一个数字(0~9),并且需要自己编写链表的相关操作。另外,大整数的加减法操作需要注意进位和借位的问题。
下面是一个参考代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LEN 50 // 最大位数
typedef struct node { // 链表结点定义
int value; // 存储的数字
struct node *next; // 指向下一个结点的指针
} Node;
typedef struct { // 链表定义
Node *head; // 头结点指针
int len; // 长度
} LinkedList;
void init_list(LinkedList *list);
void add_to_list(LinkedList *list, int value);
void print_list(LinkedList list);
void generate_number_str(char *num_str, int max_len);
LinkedList generate_list(char *num_str);
LinkedList add_list(LinkedList list1, LinkedList list2);
LinkedList sub_list(LinkedList list1, LinkedList list2);
int main() {
srand(time(NULL)); // 初始化随机数种子
char num_str1[MAX_LEN + 1], num_str2[MAX_LEN + 1];
generate_number_str(num_str1, MAX_LEN);
generate_number_str(num_str2, MAX_LEN);
LinkedList list1 = generate_list(num_str1);
LinkedList list2 = generate_list(num_str2);
printf("num1: ");
print_list(list1);
printf("num2: ");
print_list(list2);
LinkedList result = add_list(list1, list2); // 进行加法操作
printf("Addition result: ");
print_list(result);
result = sub_list(list1, list2); // 进行减法操作
printf("Subtraction result: ");
print_list(result);
return 0;
}
// 初始化链表
void init_list(LinkedList *list) {
list->head = NULL;
list->len = 0;
}
// 添加结点到链表尾部
void add_to_list(LinkedList *list, int value) {
Node *node = malloc(sizeof(Node)); // 创建结点
node->value = value;
node->next = NULL;
if (list->head == NULL) { // 链表为空,设置头结点
list->head = node;
} else { // 链表不为空,遍历到尾部
Node *last = list->head;
while (last->next != NULL) {
last = last->next;
}
last->next = node;
}
list->len++;
}
// 打印链表中的数字
void print_list(LinkedList list) {
Node *node = list.head;
while (node != NULL) {
printf("%d", node->value);
node = node->next;
}
printf("\n");
}
// 随机生成一个指定长度的数字串
void generate_number_str(char *num_str, int max_len) {
int len = rand() % max_len + 1; // 随机生成长度
for (int i = 0; i < len; i++) {
num_str[i] = rand() % 10 + '0'; // 随机生成数字字符
}
num_str[len] = '\0';
}
// 将数字串转换为链表
LinkedList generate_list(char *num_str) {
LinkedList list;
init_list(&list);
int len = 0;
while (num_str[len] != '\0') {
len++;
}
for (int i = 0; i < len; i++) {
int value = num_str[i] - '0'; // 将字符转换为数字
add_to_list(&list, value);
}
return list;
}
// 大整数加法
LinkedList add_list(LinkedList list1, LinkedList list2) {
LinkedList result;
init_list(&result);
Node *node1 = list1.head;
Node *node2 = list2.head;
int carry = 0; // 进位标志
while (node1 != NULL || node2 != NULL) {
int value1 = node1 ? node1->value : 0; // 如果链表已经遍历完,使用 0
int value2 = node2 ? node2->value : 0;
int sum = value1 + value2 + carry; // 相加
carry = sum / 10; // 如果有进位,carry 置为 1
int value = sum % 10; // 当前位的结果
add_to_list(&result, value);
if (node1) node1 = node1->next; // 遍历链表
if (node2) node2 = node2->next;
}
if (carry) { // 如果最高位有进位,需要再添加一位
add_to_list(&result, 1);
}
return result;
}
// 大整数减法
LinkedList sub_list(LinkedList list1, LinkedList list2) {
LinkedList result;
init_list(&result);
Node *node1 = list1.head;
Node *node2 = list2.head;
int borrow = 0; // 借位标志
while (node1 != NULL) {
int value1 = node1->value;
int value2 = node2 ? node2->value : 0; // 如果链表已经遍历完,使用 0
value1 -= borrow; // 处理上一位借位的情况
borrow = 0;
if (value1 < value2) { // 需要借位
value1 += 10;
borrow = 1;
}
int value = value1 - value2;
add_to_list(&result, value);
node1 = node1->next;
if (node2) node2 = node2->next;
}
// 去除结果高位的 0
Node *node = result.head;
while (node->next != NULL && node->value == 0) {
Node *temp = node;
node = node->next;
free(temp);
result.head = node;
result.len--;
}
return result;
}
```
该程序首先随机生成两个数字串,然后将其转换为链表分别存储,接着依次调用大整数加法和减法函数,并将结果输出到控制台。需要注意,由于减法操作可能产生结果中的高位为 0,因此需要在函数中特判处理。
阅读全文