每日OJ题_牛客_NC10大数乘法_C++_Java

目录

牛客_NC10大数乘法_C++_Java

题目解析

C++代码

Java代码


牛客_NC10大数乘法_C++_Java

大数乘法_牛客题霸_牛客网


题目解析

根据列竖式运算的过程模拟即可。

但是可以改进一下列竖式的过程:

  • 先计算⽆进位相乘并且相加后的结果,
  • 然后再处理进位。

C++代码

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;
    }
};

Java代码

import java.util.*;
public class Solution
{
    public String solve (String ss, String tt)
    {
        char[] s = new StringBuffer(ss).reverse().toString().toCharArray();
        char[] t = new StringBuffer(tt).reverse().toString().toCharArray();
        int m = s.length, n = t.length;
        int[] tmp = new int[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. 处理进位
        StringBuffer ret = new StringBuffer();
        int c = 0;
        for(int x : tmp)
        {
            c += x;
            ret.append((char)(c % 10 + '0'));
            c /= 10;
        }
        while(c != 0)
        {
            ret.append((char)(c % 10 + '0'));
            c /= 10;
        }
        // 3. 处理前导零
        while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0')
        {
            ret.deleteCharAt(ret.length() - 1);
        }
        return ret.reverse().toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值