当前位置: 首页 > article >正文

高精度乘法(高×高)

高精度乘法(高×高)

前言

ACWing算法基础课讲解了高×低的乘法,这里高×高作为一个进一步的补充,也是对闫总的板子做一个补充。

以下内容改编自《洛谷深入浅出》123页,我对代码进行了一点修改。

A*B Problem P1303

题目描述

给出两个非负整数,求它们的乘积。

提示

每个非负整数的位数不超过2000。

讲解

模拟乘法:

第6位第5位第4位第3位第2位第1位
a514
b495
a*b [1]25520
a*b [2]45936
a*b [3]20416
中间产物2049504120
处理进位254430
结果254430

仔细观察,可以发现 a[i]*b[j] 的贡献全部在中间产物的第 i+j-1 位上。这个性质提供了一个简便的写法:可以把所有贡献算出来,最后一口气处理所有进位问题。这样可以避免处理多次进位事件,优化效率——计算机中取模的效率远低于加法和乘法。

这个进位模拟过程与加法过程大同小异,都是把个位数留下,把个位以外的数字贡献给下一位,具体可见如下代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N = 1e5;
const int M = 1e8;

LL A[N]={0}, B[N]={0}, C[M]={0}; // 下标从1开始 
LL lena, lenb, len;

void mul() {	
	for (LL i = 1; i <= lena; i++)
		for (LL j = 1; j <= lenb; j++)
			C[i + j - 1] += A[i] * B[j]; // 计算贡献 
	for (LL i = 1; i <= len; i++) { // 进位 
		C[i + 1] += C[i] / 10;
		C[i] %= 10;
	}
	while (len > 1 && !C[len]) len--; // 去掉前导零
}

int main() {
	string a, b;
	cin >> a >> b;
	lena = a.size();
	lenb = b.size();
	len = lena + lenb; // 乘积的位数不超过两数的位数之和
	for (LL i = 1; i <= lena; i++) A[i] = a[lena - i] - '0';
	for (LL i = 1; i <= lenb; i++) B[i] = b[lenb - i] - '0';
	mul(); 
	for (LL i = len; i >= 1; i--) printf("%d", C[i]);
	
	return 0;
}

http://www.kler.cn/a/532351.html

相关文章:

  • 计算机视觉-边缘检测
  • VSCode设置内容字体大小
  • Python 科学计算
  • GRN前沿:利用DigNet从scRNA-seq数据中生成基于扩散的基因调控网络
  • C语言实现字符串排序:从代码到原理深度解析
  • 经典本地影音播放器MPC-BE.
  • 438.找到字符串中所有字母异位词
  • 数据库课程设计基于Java+MySQL+JDBC+JavaSwing的停车场管理系统源代码+数据库,进出车辆登记,车位管理
  • OSCP - Other Machines - CuteNews
  • oracle: 数据操纵语言DML/批量更新
  • C++11详解(一) -- 列表初始化,右值引用和移动语义
  • leetcode 1124. 表现良好的最长时间段
  • 开发板目录 /usr/lib/fonts/ 中的字体文件 msyh.ttc 的介绍【微软雅黑(Microsoft YaHei)】
  • Linux基础 ——tmux vim 以及基本的shell语法
  • MySQL知识点总结(十八)
  • starrocks最佳实践、行业实践
  • 014-STM32单片机实现矩阵薄膜键盘设计
  • day38|leetcode 322零钱兑换,279.完全平方数,139.单词拆分
  • 5.5.3 UML概述(一)事物
  • 深度学习篇---二维码预训练模型
  • 博通Emulex Secure HBA:后量子加密与零信任架构的存储网络革命
  • 定安县行政区划地图矢量格式cdr高清ai文件
  • MyBatis-Plus速成指南:基本CURD
  • [LeetCode]day13 19.删除链表的倒数第n个结点
  • springboot项目Redis统计在线用户
  • IFeatureWorkspace.CreateFeatureClass(),报错对COM组件的调用返回了错误 HRESULT E_FAIL