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

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

题目链接:大数乘法_牛客题霸_牛客网 (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;
    }
};

三、反思与改进

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


相关文章
|
机器学习/深度学习 存储 人工智能
《智领未来:C++ 与遗传算法在 AI 模型参数优化中的深度融合》
本文探讨了在C++中实现遗传算法并应用于人工智能模型参数优化的方法。遗传算法模拟自然界的进化过程,通过选择、交叉和变异等操作优化模型参数。文章详细介绍了C++实现遗传算法的关键步骤,包括定义个体与种群、初始化种群、适应度评估、选择、交叉、变异及迭代更新种群。此外,还讨论了C++实现遗传算法的优势与挑战,并展望了其在深度学习、强化学习、边缘计算等领域的应用前景。
286 9
|
11月前
|
数据可视化 前端开发 JavaScript
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
选择合适的地图库取决于项目的需求、团队的技术栈以及预算等因素。简单来说,新手可以从leaflet入手;GIS开发使用openlayers会更顺手一些;mapbox适应大多数2D和2.5D场景,可视化效果好,但是不开源;cesium更侧重于3D场景。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出
uiu
|
JavaScript 调度
【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)
【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)
uiu
424 0
【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)
|
安全 调度 C++
互斥锁 vs 自旋锁:底层机制详细解析
互斥锁 vs 自旋锁:底层机制详细解析
526 1
|
机器学习/深度学习 算法 测试技术
【深度学习】手写数字识别Tensorflow2实验报告
文章介绍了使用TensorFlow 2进行手写数字识别的实验报告,包括实验目的、采用全连接神经网络模型进行训练的过程、以及如何使用交叉熵作为损失函数来识别MNIST数据集的手写数字。
593 0
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何关闭或停用自治服务DAS
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
安全 Java 网络安全
如何在Java中处理SSLHandshakeException异常?
如何在Java中处理SSLHandshakeException异常?
2485 1
绿色自适应网址发布页源码
绿色自适应网址发布页源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
198 0
绿色自适应网址发布页源码
【错题集-编程题】素数回文(模拟 + 数学)
【错题集-编程题】素数回文(模拟 + 数学)
【错题集-编程题】十字爆破(预处理 + 模拟)
【错题集-编程题】十字爆破(预处理 + 模拟)