当前位置:   article > 正文

C++笔试强训day5

C++笔试强训day5

目录

1.大数加法

2.链表相加

3.大数乘法


1.大数加法

链接

就是模拟就好了,模拟加法计算的过程:

  1. class Solution {
  2. public:
  3. int tmp, m, n;
  4. string solve(string s, string t) {
  5. string ret;
  6. m = s.size() - 1;
  7. n = t.size() - 1;
  8. tmp = 0;
  9. while (m >= 0 || n >= 0 || tmp) {
  10. if (m >= 0) {
  11. tmp += s[m] - '0';
  12. m--;
  13. }
  14. if (n >= 0) {
  15. tmp += t[n] - '0';
  16. n--;
  17. }
  18. ret += tmp % 10 + '0';
  19. tmp /= 10;
  20. }
  21. reverse(ret.begin(), ret.end());
  22. return ret;
  23. }
  24. };

最后别忘记将ret逆置一下,因为是从尾开始存入的。

2.链表相加

链接

因为要模拟加法运算,链表又是单向的,所以需要将其逆转,再进行加法模拟。

即(逆序 + 高精度加法

注意:最后的结果是倒过来的,所以需要写逆置再返回。

详细代码:

  1. class Solution {
  2. public:
  3. ListNode* Reverse(ListNode* head)
  4. {
  5. ListNode* newhead = new ListNode(0);
  6. ListNode* cur = head;
  7. while(cur)
  8. {
  9. ListNode* next = cur->next;
  10. cur->next = newhead->next;
  11. newhead->next = cur;
  12. cur = next;
  13. }
  14. cur = newhead->next;
  15. delete newhead;
  16. newhead = nullptr;
  17. return cur;
  18. }
  19. ListNode* addInList(ListNode* head1, ListNode* head2) {
  20. head1 = Reverse(head1);
  21. head2 = Reverse(head2);
  22. ListNode* reth = new ListNode(0);
  23. ListNode* prev = reth;
  24. int t = 0;
  25. ListNode* cur1 = head1, *cur2 = head2;
  26. while(cur1 || cur2 || t)
  27. {
  28. if(cur1)
  29. {
  30. t += cur1->val;
  31. cur1 = cur1->next;
  32. }
  33. if(cur2)
  34. {
  35. t += cur2->val;
  36. cur2 = cur2->next;
  37. }
  38. prev = prev->next = new ListNode(t % 10);
  39. t /= 10;
  40. }
  41. ListNode* cur = reth->next;
  42. delete reth;
  43. reth = nullptr;
  44. return Reverse(cur);
  45. }
  46. };

3.大数乘法

链接

实际上就是模拟乘法运算。

根据上述分析可以得到,其在一个点的和的下标正好为s和t的下标相加。(因此将每个string反过来更好分析和计算【因为下标的缘故】

最后将得到的和进行高精度加法就可得结果(返回时记得除去前导零与逆置

这道题要处理的细节还是蛮多的,要多加分析特殊情况

详细代码:

  1. class Solution {
  2. public:
  3. string solve(string s, string t) {
  4. int m = s.size();
  5. int n = t.size();
  6. vector<int> tmp(m + n);
  7. string ret;
  8. reverse(s.begin(), s.end());
  9. reverse(t.begin(), t.end());
  10. // 用vector存储每个位置的和
  11. for(int i = 0; i < m; ++i)
  12. {
  13. for(int j = 0; j < n; ++j)
  14. {
  15. tmp[i + j] += (s[i] - '0') * (t[j] - '0');
  16. }
  17. }
  18. // 遍历vector且高精度相加
  19. int tt = 0;
  20. for(int i : tmp)
  21. {
  22. int sum = i + tt;
  23. ret += sum % 10 + '0';
  24. tt = sum / 10;
  25. }
  26. // 加上剩余的进位
  27. while(tt)
  28. {
  29. ret += tt % 10 + '0';
  30. tt /= 10;
  31. }
  32. // 出去前导0
  33. while(ret.size() > 1 && ret.back() == '0')
  34. ret.pop_back();
  35. // 逆置返回
  36. reverse(ret.begin(), ret.end());
  37. return ret;
  38. }
  39. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/864339
推荐阅读
相关标签
  

闽ICP备14008679号