笔试强训day06

大数加法

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        reverse(s.begin(),s.end());
        reverse(t.begin(),t.end());
        string result;
        int n = s.size(),m = t.size();
        int carry = 0;

        for(int i = 0;i<n||i<m||carry;++i)
        {
            int t1 = 0,t2 = 0;
            if(i<n)t1 = s[i]-'0';
            if(i<m)t2 = t[i]-'0';
            carry += t1+t2;
            result += carry%10+'0';
            carry/=10;
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

链表相加

class Solution {
  public:
// 逆序链表
    ListNode* reverse(ListNode* head) {
        ListNode* newHead = new ListNode(0);
        ListNode* cur = head;
        while (cur) {
            ListNode* next = cur->next;
            cur->next = newHead->next;
            newHead->next = cur;
            cur = next;
        }
        cur = newHead->next;
        delete newHead;
        return cur;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
// 1. 逆序
        head1 = reverse(head1);
        head2 = reverse(head2);
// 2. ⾼精度加法
        int t = 0;
        ListNode* cur1 = head1, *cur2 = head2;
        ListNode* ret = new ListNode(0);
        ListNode* prev = ret;
        while (cur1 || cur2 || t) {
            if (cur1) {
                t += cur1->val;
                cur1 = cur1->next;
            }
            if (cur2) {
                t += cur2->val;
                cur2 = cur2->next;
            }
            prev = prev->next = new ListNode(t % 10);
            t /= 10;
        }
        cur1 = ret->next;
        ret->next = nullptr;
        delete ret;
        return reverse(cur1);
    }
};

大数乘法

class Solution {
  public:
    string solve(string s, string t) {
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());
        int m = s.size(), n = t.size();
        vector<int> tmp(m + n);
// 1. ⽆进位相乘相加
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                tmp[i + j] += (s[i] - '0') * (t[j] - '0');
            }
        }
// 2. 处理进位
        int c = 0;
        string ret;
        for (auto x : tmp) {
            c += x;
            ret += c % 10 + '0';
            c /= 10;
        }
        while (c) {
            ret += c % 10 + '0';
            c /= 10;
        }
// 3. 处理前导零
        while (ret.size() > 1 && ret.back() == '0') ret.pop_back();

        reverse(ret.begin(), ret.end());
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值