【LeetCode】大数相乘
1. 模拟手工计算
原理:
- 将 string 反转存储在 int 数组中,如 A = 17 = (7, 1),B = 25 = (5, 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) - 将 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】大数相乘的更多相关文章
- leetcode 43 Multiply Strings 大数相乘
感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(nu ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- 大数相乘算法C++版
#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN ...
- java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...
- Karatsuba乘法--实现大数相乘
Karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.此算法主要用于两个大数相乘 ...
- Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...
- 华为上机测试题(大数相乘-java)
PS:这个不是自己写的,测试OK,供参考. /** * 大数相乘 */ public class BigData { public static void main(String[] args) { ...
- 求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...
- 1051:A × B problem 大数相乘
给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraimen ...
随机推荐
- c++中static的用法详解
C 语言的 static 关键字有三种(具体来说是两种)用途: 1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数. int foo(){ static int i = 1; // ...
- <aop:aspect>与<aop:advisor>的区别
在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>:在进行事务管理时,我们会使用< aop:advisor>.那么,对于&l ...
- 获得WebBrowser中的图片数据
/// <summary> /// 获取WebBrowser指定的图片 /// </summary> /// <param name="webBrowser&q ...
- 因样式冲突引起的div消失问题
工作需要,搭建一个网站的模型,简单分成三个部分,标题栏,导航栏,主界面,效果如图: 但是点击界面的任意地方,中间的div块消失了,如图所示: 调试,发现在点击界面其他地方的时候display属性有变化 ...
- np.zeros
np.zeros构造一个全部由0组成的矩阵 用法:zeros(shape, dtype = float, order = 'C') 参数: shape:形状 dtype类型: t ,位域,如t4代表4 ...
- 《剑指offer》第五十九题(队列的最大值)
// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...
- python类中保存非绑定方法作为成员函数
习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...
- 在cmd中登录MySQL数据库
mysql -uroot -p 输入密码,即可
- P493 brass
实现多态共有继承的两种方法 1 在派生类中重新定义基类的方法 2 使用虚方法 P493程序清单13.7使用的方法为在派生类中重新定义基类的方法 brass.h #ifndef BRASS_H #def ...
- Windows 操作系统与内核版本号
Win10查询内部版本(内核版本)的方法:1.按下Win+R组合键启动“运行”窗口,输入“msconfig”并确定2.在“系统配置”窗口中点击“工具”标签,选择“关于Windows”一项后点击“启动” ...