【错题集-编程题】大数乘法(模拟 + 高精度乘法)

简介: 【错题集-编程题】大数乘法(模拟 + 高精度乘法)

题目链接:大数乘法_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

根据列竖式运算的过程模拟即可,但是我们可以改进⼀下列竖式的过程:

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

细节:题目所给的两个字符串需要提前逆序,方便从低位开始进行运算,其次要注意字符和数字的转化,还有进位和前导 0 的处理。


二、代码

//看了题解之后AC的代码
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        int n=s.size(), m=t.size();
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());
        string res;
        vector<int> sum(n+m-1);
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                sum[i+j]+=(s[i]-'0')*(t[j]-'0');
        int k=0;
        int i=0;
        while(i<n+m-1)
        {
            k+=sum[i];
            res+=(k%10)+'0';
            k/=10;
            i++;
        }
        while(k)
        {
            res+=(k%10)+'0';
            k/=10;
        }
        while(res.size()>1 && res.back()=='0')
            res.pop_back();
        reverse(res.begin(), res.end());
        return res;
    }
};
 
//值得学习的代码
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;
    }
};

三、反思与改进

这道题的思路蛮清晰的,基本正确,但是却没想到是用了临时变量间接导致两数相加过大,超出了数据范围,导致有些数据很大的样例过不去,还以为是数字过大有其他的做法,其实并不是,模板已经能解决所有数据了。本质还是模板没有完全弄明白并熟记,这是妥妥送分题,要保证模板题不能再出错!


相关文章
|
3月前
|
算法 C++
第一周算法设计与分析 F : 模拟计算器
该文章 "第一周算法设计与分析 F : 模拟计算器" 的摘要或讨论。这篇文章介绍了如何设计一个程序来模拟一个基本的计算器,处理包含加、减、乘运算的表达式,并给出了相应的C++代码实现
|
3月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
5月前
|
存储 索引
每日刷题——相遇、宝石(模拟+数学)、相助(模拟+数组)、相依(dp的优化)
每日刷题——相遇、宝石(模拟+数学)、相助(模拟+数组)、相依(dp的优化)
38 1
|
6月前
【错题集-编程题】素数回文(模拟 + 数学)
【错题集-编程题】素数回文(模拟 + 数学)
|
6月前
【错题集-编程题】春游(模拟 - 分情况讨论)
【错题集-编程题】春游(模拟 - 分情况讨论)
|
6月前
【错题集-编程题】排序子序列(模拟)
【错题集-编程题】排序子序列(模拟)
|
6月前
|
开发框架 .NET
【期末不挂科-单片机考前速过系列P4】(第四章:32题搞定基本指令例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P4】(第四章:32题搞定基本指令例题)经典例题盘点(带图解析)
|
算法 C语言
【零钱问题】C语言贪心算法分析(文末彩蛋)
【零钱问题】C语言贪心算法分析(文末彩蛋)
157 0
|
6月前
|
C语言
|
6月前
|
存储 机器学习/深度学习 Windows
【题型总结】模拟运算
【题型总结】模拟运算
45 0