對上面的代碼進行大數輸入的優化
时间: 2024-03-04 19:48:14 浏览: 9
上面的代码中,大数的输入是通过手动创建链表节点的方式进行的,如果需要输入的大数位数很大,这种方式就很繁琐。可以通过字符串输入大数,然后将其转换为链表的方式进行优化,具体实现如下:
```c++
#include <iostream>
#include <string>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* stringToListNode(string str)
{
ListNode* head = new ListNode(0);
ListNode* p = head;
for (int i = str.size() - 1; i >= 0; i--)
{
int num = str[i] - '0';
p->next = new ListNode(num);
p = p->next;
}
return head->next;
}
string listNodeToString(ListNode* node)
{
string str = "";
while (node != NULL)
{
str = to_string(node->val) + str;
node = node->next;
}
return str;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* res = new ListNode(0);
ListNode* p3 = res;
int carry = 0;
while (p1 != NULL || p2 != NULL || carry != 0)
{
int sum = (p1 == NULL ? 0 : p1->val) + (p2 == NULL ? 0 : p2->val) + carry;
carry = sum / 10;
p3->next = new ListNode(sum % 10);
p3 = p3->next;
p1 = p1 == NULL ? NULL : p1->next;
p2 = p2 == NULL ? NULL : p2->next;
}
return res->next;
}
ListNode* subtractTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* res = new ListNode(0);
ListNode* p3 = res;
int borrow = 0;
while (p1 != NULL || p2 != NULL)
{
int num1 = p1 == NULL ? 0 : p1->val;
int num2 = p2 == NULL ? 0 : p2->val;
int diff = num1 - num2 - borrow;
if (diff < 0)
{
diff = diff + 10;
borrow = 1;
}
else
{
borrow = 0;
}
p3->next = new ListNode(diff);
p3 = p3->next;
p1 = p1 == NULL ? NULL : p1->next;
p2 = p2 == NULL ? NULL : p2->next;
}
return res->next;
}
int main()
{
string str1, str2;
cout << "Enter two big numbers: ";
cin >> str1 >> str2;
ListNode* l1 = stringToListNode(str1);
ListNode* l2 = stringToListNode(str2);
ListNode* sum = addTwoNumbers(l1, l2);
cout << "Sum: " << listNodeToString(sum) << endl;
ListNode* diff = subtractTwoNumbers(l1, l2);
cout << "Difference: " << listNodeToString(diff) << endl;
return 0;
}
```
通过将大数输入的字符串转换为链表,可以更方便地进行输入操作,并且可以支持更大位数的大数运算。