问题描述:用c语言设计一个程序实现两个任意长的整数的求和运算。 基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开如:1, 0000. 0000. 0000. 0000.并对代码进行分析
时间: 2025-01-19 07:07:32 浏览: 56
在C语言中,我们可以设计一个程序来实现两个任意长度的整数的加法运算,通过双向循环链表存储每一位数字。以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
int digit;
struct Node *prev, *next;
} Node;
// 创建新节点并初始化
Node* createNode(int digit) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->digit = digit;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 添加一位到链表末尾
void appendNode(Node** head, int digit) {
Node* newNode = createNode(digit);
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
}
// 将链表转换为字符串
char* convertListToNumber(Node* head) {
char* result = malloc(512);
Node* temp = head;
sprintf(result, "%d", temp->digit);
while (temp->next != NULL) {
result[strlen(result)] = ',';
result[strlen(result) + 1] = ' ';
sprintf(&result[strlen(result)], "%d", temp->next->digit);
temp = temp->next;
}
result[strlen(result) - 1] = '\0'; // 移除最后的逗号
return result;
}
int main() {
Node* num1_head = NULL;
Node* num2_head = NULL;
Node* carry = NULL; // 存储进位
// 输入第一个整数
printf("请输入第一个整数(每四位一组,用空格分隔):");
char input1[512];
fgets(input1, sizeof(input1), stdin);
strtok(input1, " ");
// 分割输入,并添加到链表
for (int i = 0; strtok(NULL, " "); i++) {
int digit = atoi(strtok(NULL, ""));
appendNode(&num1_head, digit);
}
// 输入第二个整数
printf("请输入第二个整数(格式同上):");
char input2[512];
fgets(input2, sizeof(input2), stdin);
strtok(input2, " ");
// 同样处理第二个整数
for (int i = 0; strtok(NULL, " "); i++) {
int digit = atoi(strtok(NULL, ""));
appendNode(&num2_head, digit);
}
// 加法运算
temp = carry = num1_head;
while (num1_head != NULL || num2_head != NULL) {
int sum = 0;
if (num1_head != NULL) {
sum += num1_head->digit;
num1_head = num1_head->next;
}
if (num2_head != NULL) {
sum += num2_head->digit;
num2_head = num2_head->next;
}
sum += carry; // 如果有进位
carry = sum / 10; // 计算新的进位
sum %= 10; // 取当前位的数值
// 将结果添加到链表
appendNode(&temp, sum);
temp = temp->prev;
}
if (carry > 0) { // 如果还有剩余的进位
appendNode(&temp, carry);
}
// 输出结果
char* result = convertListToNumber(temp->prev); // 结果是从后往前读取的
printf("两数相加的结果是:%s\n", result);
free(result);
free(temp);
return 0;
}
```
阅读全文
相关推荐



















