博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】43. Multiply Strings 大数乘法
阅读量:6924 次
发布时间:2019-06-27

本文共 2466 字,大约阅读时间需要 8 分钟。

1. 题目

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note:

The numbers can be arbitrarily large and are non-negative.
Converting the input string to integer is NOT allowed.
You should NOT use internal library such as BigInteger.

2. 思路

模拟手算的过程,按位相乘并累加。

方便处理中间结果,每次保存的都是逆序的,然后反转。也可以每次都保持逆序结果,到最后的时候再反转过来。

3. 代码

耗时:26ms

class Solution {public:    // 模拟乘法手算过程实现    string multiply(string num1, string num2) {        string sum;        sum.reserve(num1.length() * num2.length() + 2);        string prefix;        // 从低到高位逐个字符相乘,然后加入到总和中去。        for (int i = num2.length() - 1; i >= 0; i--) {            char c2 = num2[i];            string c_sum = multiply(num1, c2) + prefix;            sum = plus(sum, c_sum);            prefix += '0';        }        // 去掉前导0多余的0,至少保留一位        int i = 0;        while (sum[i] == '0' && i < sum.length() - 1) {i++;}        return sum.substr(i);    }        string multiply(string& n, char c) {        string r;        r.reserve(n.length() + 2);        int jingwei = 0;        for (int i = n.length() - 1; i>= 0; i--) {            int m = multiply(n[i], c);            m += jingwei;            r += m % 10 + '0';            jingwei = m / 10;        }        if (jingwei != 0) {            char ch = '0' + jingwei;            r += ch;        }        reverse(r.begin(), r.end());        return r;    }        int multiply(char c1, char c2) {        return (c1 - '0') * (c2 - '0');    }        string plus(string& n1, string& n2) {        string n3;        int l1 = n1.length();        int l2 = n2.length();        int min_v = min(l1, l2);        int max_v = max(l1, l2);        n3.reserve(max_v + 2);        char jingwei = '0';        for (int i = 1; i <= min_v; i++) {            char c1 = n1[l1 - i];            char c2 = n2[l2 - i];            int c_sum = plus(c1, c2, jingwei);            n3 += c_sum % 10 + '0';            jingwei = c_sum / 10 + '0';        }        string& big = n1;        if (l2 > l1) { big = n2; }        for (int i = min_v + 1; i <= max_v; i++) {            int c_sum = plus(big[max_v - i], jingwei);            jingwei = c_sum / 10 + '0';            n3 += c_sum % 10 + '0';        }        if (jingwei != '0') {            n3 += jingwei;        }        reverse(n3.begin(), n3.end());        return n3;    }    int plus(char c1, char c2) {        return c1 + c2 - 2 * '0';    }    int plus(char c1, char c2, char c3) {        return c1 + c2 + c3 - 3 * '0';    }};

转载地址:http://hcujl.baihongyu.com/

你可能感兴趣的文章
php多维数组去掉重复值
查看>>
Struts上路_13-OGNL对象图导航语言
查看>>
Maven 启动找不到 Launcher 的问题
查看>>
TensorFlow 官方API学习02--MNIST(上)
查看>>
Python watchdog
查看>>
网络爬虫01: Urllib2库使用代理IP
查看>>
又好又快,免费学习编程的9个地方
查看>>
PreparedStatement 用问号传参引发查询(SQLServer )数据慢的解决方案
查看>>
CAS 单点登录碰到问题汇总
查看>>
Java异常处理最佳实践及陷阱防范
查看>>
mysql报错 could not fetch initial value for incre...
查看>>
zabbix 微信api告警调用
查看>>
VS2008模板遗失问题(转载孙焱的博客)
查看>>
Laravel5.2之Filesystem源码解析(上)
查看>>
PHP PSR-1 基本代码规范(中文版)
查看>>
PHP判断缓存文件是否修改的方法
查看>>
brew安装amp需要注意的点
查看>>
sizeof与strlen的区别
查看>>
快嘉开发框架脚手架及使用说明v1
查看>>
laravel 自带Auth多用户认证
查看>>