C++编写一个用单链表实现非负大整数的加法运算的程序。测试输入,每两行表示一个大整数,第一行是整数位数,第二行是整数各个数位: 5 1 2 3 4 5 3 4 5 6 预期输出: 1 2 8 0 1
时间: 2024-11-22 12:43:06 浏览: 24
在C++中,我们可以使用动态内存分配和单链表来实现非负大整数的加法运算。首先,我们需要创建一个节点结构来存储每一位数字,并有一个指针指向链表的头。然后,我们遍历两个输入的链表,逐位相加并将结果添加到新的链表中。
下面是一个简单的实现示例:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0); // 创建虚拟头节点,避免处理边界条件
ListNode* current = &dummy; // 初始化当前节点
while (l1 != NULL || l2 != NULL) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
// 如果当前结果超过10,则需要进位
if (sum >= 10) {
current->next = new ListNode(sum % 10);
sum /= 10;
} else {
current->next = new ListNode(sum);
break;
}
l1 = (l1 && l1->next) ? l1->next : NULL;
l2 = (l2 && l2->next) ? l2->next : NULL;
current = current->next;
}
if (sum > 0) { // 如果还有剩余进位,追加一个节点
current->next = new ListNode(sum);
}
return dummy.next;
}
void printList(ListNode* node) {
while (node) {
cout << node->val;
node = node->next;
if (node) cout << ' ';
}
cout << endl;
}
int main() {
// 测试输入
int n1 = 5;
string str1 = "12345";
ListNode* l1 = buildList(n1, str1);
int m = 3;
string str2 = "456";
ListNode* l2 = buildList(m, str2);
ListNode* result = addTwoNumbers(l1, l2);
printList(result);
return 0;
}
// 辅助函数,将字符串转换为链表
ListNode* buildList(int len, const string& digitsStr) {
ListNode* head = nullptr;
for (char digit : digitsStr) {
head = insert(head, digit - '0');
}
return head;
}
// 插入节点到链表
ListNode* insert(ListNode* head, int val) {
ListNode* newNode = new ListNode(val);
if (!head) return newNode;
newNode->next = head;
return head;
}
```
这个程序首先将输入的字符串转换成链表,然后通过`addTwoNumbers`函数计算加法,最后通过`printList`函数打印出结果。注意,由于题目要求的是按从低位到高位的顺序输出结果,所以链表的输出会先显示最低位。
阅读全文