用鏈表不用類的高精度加減法
时间: 2024-03-04 16:48:18 浏览: 126
加减法中的符号处理-高精度整数_刘汝佳
以下是使用链表实现高精度加减法的示例代码:
```c++
#include <iostream>
#include <string>
using namespace std;
// 定义链表节点结构体
struct Node {
int val;
Node* next;
Node(int x): val(x), next(nullptr) {}
};
// 定义链表类
class LinkedList {
public:
LinkedList(string numStr = ""); // 构造函数,用字符串初始化链表
void add(LinkedList& other); // 加法操作,将另一个链表加到当前链表上
void subtract(LinkedList& other); // 减法操作,将另一个链表从当前链表上减去
void print(); // 输出当前链表表示的大数
private:
Node* head; // 链表头指针
};
// 构造函数,用字符串初始化链表
LinkedList::LinkedList(string numStr) {
head = new Node(0); // 创建头节点
Node* cur = head; // 当前节点指针
for (int i = numStr.size() - 1; i >= 0; i--) {
int digit = numStr[i] - '0'; // 将字符转换为数字
cur->next = new Node(digit); // 创建新节点
cur = cur->next; // 移动指针
}
}
// 加法操作,将另一个链表加到当前链表上
void LinkedList::add(LinkedList& other) {
Node* cur1 = head->next; // 当前节点指针1
Node* cur2 = other.head->next; // 当前节点指针2
int carry = 0; // 进位变量
while (cur1 && cur2) {
int sum = cur1->val + cur2->val + carry; // 计算当前位的和
carry = sum / 10; // 计算进位
cur1->val = sum % 10; // 更新当前位的值
cur1 = cur1->next; // 移动指针1
cur2 = cur2->next; // 移动指针2
}
while (cur1) { // 如果链表1还有剩余节点
int sum = cur1->val + carry; // 计算当前位的和
carry = sum / 10; // 计算进位
cur1->val = sum % 10; // 更新当前位的值
cur1 = cur1->next; // 移动指针1
}
if (carry) { // 如果还有进位
cur1 = head->next;
while (cur1->next) { // 找到链表1的最后一个节点
cur1 = cur1->next;
}
cur1->next = new Node(carry); // 在链表1的末尾添加一个节点
}
}
// 减法操作,将另一个链表从当前链表上减去
void LinkedList::subtract(LinkedList& other) {
Node* cur1 = head->next; // 当前节点指针1
Node* cur2 = other.head->next; // 当前节点指针2
int borrow = 0; // 借位变量
while (cur1 && cur2) {
int diff = cur1->val - cur2->val - borrow; // 计算当前位的差
if (diff < 0) { // 如果需要借位
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
cur1->val = diff; // 更新当前位的值
cur1 = cur1->next; // 移动指针1
cur2 = cur2->next; // 移动指针2
}
while (cur1) { // 如果链表1还有剩余节点
int diff = cur1->val - borrow; // 计算当前位的差
if (diff < 0) { // 如果需要借位
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
cur1->val = diff; // 更新当前位的值
cur1 = cur1->next; // 移动指针1
}
// 删除前导0
while (head->next && head->next->val == 0) {
Node* tmp = head->next;
head->next = tmp->next;
delete tmp;
}
}
// 输出当前链表表示的大数
void LinkedList::print() {
Node* cur = head->next; // 当前节点指针
while (cur) {
cout << cur->val;
cur = cur->next;
}
cout << endl;
}
// 主函数,测试加减法操作
int main() {
string num1, num2;
cout << "请输入两个大数:" << endl;
cin >> num1 >> num2;
LinkedList l1(num1), l2(num2), l3(num1), l4(num2);
l1.add(l2);
l3.subtract(l4);
cout << "加法结果为:";
l1.print();
cout << "减法结果为:";
l3.print();
return 0;
}
```
这里使用了链表来表示大数,通过重载链表的加减法操作来实现高精度计算。需要注意的是,在减法操作中可能会出现负数,需要使用借位来处理。此外,减法操作完成后还需要删除结果中的前导0。
阅读全文