1. 模拟手工计算

原理:

  1. 将 string 反转存储在 int 数组中,如 A = 17 = (7, 1),B = 25 = (5, 2),亦即幂表示法,幂次是从低位到高位。
  2. 作逐位相乘,即 ai × bj,结果加入到积 C 的第 i+j 位,消除高位的 0,最后处理进位。
    C = A × B = (7 × 5, 1 × 5 + 7 × 2, 1 × 2) = (35, 19, 2) -> (5, 22, 2) -> (5, 2, 4)
  3. 将 int 数组逆序转换为 string,C = (5, 2, 4) = 425。
 string multiply(string num1, string num2) {
vector<int> n1 = string2Int(num1), n2 = string2Int(num2);
vector<int> result = mul(n1, n2);
return int2String(result);
} vector<int> string2Int(string s) {
vector<int> v;
for (int i = s.size() - ; i >= ; i--)
v.push_back(s[i] - '');
return v;
} vector<int> mul(vector<int> n1, vector<int> n2) {
vector<int> result(n1.size() + n2.size(), );
/* 逐位相乘 */
for (int i = ; i < n1.size(); i++)
for (int j = ; j < n2.size(); j++)
result[i + j] += n1[i] * n2[j];
/* 消除多余的0 */
for (int i = result.size() - ; i > && result[i] == ; i--)
result.pop_back();
/* 进位 */
int c = ;
for (int i = ; i < result.size(); i++) {
result[i] += c;
c = result[i] / ;
result[i] %= ;
}
if (c)
result.push_back(c);
return result;
} string int2String(vector<int> v) {
string s = "";
for (int i = v.size() - ; i >= ; i--)
s += to_string(v[i]);
return s;
}

PS:

char 转 int   ——  ch - '0'

int 转 char   ——  i + '0'

int 转 string  ——  to_string(i)

【char 就是一种特殊的 int 啊有木有!!!】

另外还有两种较为复杂的算法,在下实力有限,没有研究透。

2. 分治法

当把大整数分为 2 段时,算法时间复杂度最低,为 O(n^log23) = O(n1.58)

3. FFT法(快速傅里叶变换)

时间复杂度 O(nlogn)

【LeetCode】大数相乘的更多相关文章

  1. leetcode 43 Multiply Strings 大数相乘

    感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(nu ...

  2. POJ 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...

  3. 大数相乘算法C++版

    #include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN ...

  4. java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...

  5. Linux C/C++ 编程练手 --- 大数相加和大数相乘

    最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...

  6. Karatsuba乘法--实现大数相乘

    Karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.此算法主要用于两个大数相乘 ...

  7. Java 大数相乘、大数相加、大数相减

    思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...

  8. 华为上机测试题(大数相乘-java)

    PS:这个不是自己写的,测试OK,供参考. /** * 大数相乘 */ public class BigData { public static void main(String[] args) { ...

  9. 求解Catalan数,(大数相乘,大数相除,大数相加)

    Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...

  10. 1051:A × B problem 大数相乘

    给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraimen ...

随机推荐

  1. jquery.validate使用详解

    一.简单应用实例: 1.用class样式进行验证,用法简单,但不能自定义错误信息,只能修改jquery-1.4.1.min.js中的内置消息,也不支持高级验证规则. <script type=& ...

  2. springmvc通过ajax异步请求返回json格式数据

    jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...

  3. 【selenium2】【selenium基础语法】

    #栗子 设置浏览器窗口大小 driver.set_window_size(480,800) #栗子 设置浏览器大小为最大maximize_window() 控制浏览器前进.后退 #栗子from sel ...

  4. 性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0

    小蚂蚁说: 相信大家对蚂蚁金服自主研发的金融级分布式关系数据库OceanBase的故事不再陌生了.在刚刚过去的2018年天猫双11中,成交额2135亿再次创造了新纪录,而支撑今年双11的支付宝核心链路 ...

  5. hdu 6053 TrickGCD 筛法

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Probl ...

  6. P4001 [BJOI2006]狼抓兔子

    传送门 思路: 不少题解都是用网络流来做最小割(网络流是什么),但对于一个不会网络流的蒟蒻来做这题相当困难. 听机房daolao说可以重构图做最短路.然后就baidu将平面图转换成一个对偶图,因为网络 ...

  7. javaSE习题 第二章 基本数据类型和数组

    问答: 1.什么叫标识符,标识符的规则是什么? 用来标志类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符. 规则:1.由字母,数字,下划线,美元组成.2.标识符第一个字符不能是数字 ...

  8. anusplina 4.36版本使用提示 说明

    1),必须要注意的是,你生成的dat文件中,第一列必须是气象站点编号:第二列必须是经度数值,而且是投影坐标下,以 米 为单位:第三列必须是纬度了:第四列必须是海拔了:之后就是你自己的数据,比如平均温度 ...

  9. 力扣(LeetCode)520. 检测大写字母

    给定一个单词,你需要判断单词的大写使用是否正确. 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA". 单词中所有字母都不是大写,比如"l ...

  10. indexOf includes 区别

    indexOf     返回数值类型   ( 索引.-1 ) includes    返回布尔类型    ( true  .false  ),且能区分出 NaN  undefined ( 如新建空数组 ...