高精度乘法的实现

         这是C++算法基础-基础算法专栏的第九篇文章,专栏详情请见此处


引入

        上次我们学习了高精度加法的实现,这次我们要学习高精度减法的实现。

        高精度乘法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现。

        在这里就不再详细讲解,只讲解主体过程qwq

        这里需要说明,此博客(包括后面一篇),都是实现两个高精度数之间的计算,而算法基础课中仅仅实现了一个高精度数​​​​​​​和一个低精度数​​​​​​​之间的计算,思路和代码上两者有所不同。

主体过程

        呃,高精度乘高精度先等会儿,我们先看一种简单的情况。

        高精度乘低精度

        高精度乘低精度的原理和小学学习的竖式乘法是一样的。

        

         概括来说,从个位开始,将低精度乘数与高精度乘数的每一位相乘,存进积的对应位置上,若当前位达到10进位,也就是将下一位加上当前位(整)除以10,并把当前位模10

        89\times 123用高精度计算(123为高精度乘数,89为低精度乘数),先乘个位,3\times 89267,发现267大于等于10,所以将267(整)除以10,得26,将其存入答案的十位,再将26710,得7,将其存入答案的个位;

        再乘十位,2\times 89+26204,发现204大于等于10,所以将204(整)除以10,得20,将其存入答案的百位,再将20410,得4,将其存入答案的十位;

        再乘百位,1\times 89+20109,发现109大于等于10,所以将109(整)除以10,得10,将其存入答案的千位,再将10910,得9,将其存入答案的百位;

        最后,千位的10大于等于10,所以将10(整)除以10,得1,将其存入答案的万位,再将1010,得0,将其存入答案的千位;得到答案10947

        高精度乘高精度

        我们通过高精度乘低精度可以看出,运算89\times 123,实际就是将123分解成1\times 10^{2}+2\times 10^{1}+3\times 10^{0},再分别用每一位去乘89

        高精度乘高精度也是一样的。若还想计算高精度乘高精度的89 \times 123,我们就可以受高精度乘低精度的启发,将89123分解成8 \times 10^{1}+9\times 10^{0}1\times 10^{2}+2\times 10^{1}+3\times 10^{0},再分别相乘,即9\times 10^{0}\times 3\times 10^{0}+8 \times 10^{1}\times 3\times 10^{0}+9\times 10^{0}\times 2\times 10^{1}+8 \times 10^{1}\times 2\times 10^{1}+9\times 10^{0}\times 1\times 10^{2}+8 \times 10^{1}\times 1\times 10^{2},化简,得9\times 3\times 10^{0}+8 \times 3\times 10^{1}+9\times 2\times 10^{1}+8 \times 2\times 10^{2}+9\times 1\times 10^{2}+8 \times 1\times 10^{3}

        从这个复杂的式子上可以看出,若当前两个乘数分别的位置ij相乘时,答案会存储在i+j这个位置上。

        嗯,有点复杂,结合代码食用会好一些。

代码

        下面给出高精度乘法的代码:

void mul(int a[],int b[],int c[]){clear(c);for(int i=0;i<L-1;i++){for(int j=0;j<=i;j++)c[i]+=a[j]*b[i-j];if(c[i]>=10){c[i+1]+=c[i]/10;c[i]%=10;}}
}

上一篇-高精度减法的实现    C++算法基础专栏文章    下一篇-高精度除法的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看LabVIEW及各个模块和驱动的版本号

要方便地查看当前计算机上安装的LabVIEW版本以及各个模块和驱动的版本号&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用NI MAX (Measurement & Automation Explorer) NI MAX 是一个强大的工具&#xff0c;可以帮助你管理National Instruments硬件、软件和驱动程序…

Docker(三)-Docker常用命令

1.run run命令执行流程:2.帮助启动类命令 2.1 启动docker systemctl start docker2.2 停止docker systemctl stop docker2.3 重启docker systemctl restart docker2.4查看docker状态 systemctl status docker2.5开机启动 systemctl enable docker2.6查看docker概要信息 …

c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写

前言 在上一篇文章中我们介绍了在计算机底层视角下的虚拟内存和操作系统在用户层所进行的各个分层&#xff0c;在这篇文章我们就要开始尝试书写多线程代码了,其实在c11后c就提供供了线程类给我们使用,c线程类其实主要是对c操作多线程的函数进行了封装&#xff0c;本质上其实是…

VB.net实战(VSTO):VSTOwpf体验框架打包教程

如果是考虑到Wps用户较多&#xff0c;就不建议采用侧边栏的形式 只是个体验框架&#xff0c;界面未作美化&#xff0c;office的用户可以用任意一种窗体&#xff0c;喜欢那个界面就写那个界面&#xff0c;wps的侧边栏只能弹出一部分&#xff0c;每次需要的手动拖动。 打包了案例…

Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录 文件字节输入流&#xff1a;每次读取多个字节 实例演示 注意事项 文件字节输入流&#xff1a;一次读取完全部字节 方式一 方式二 注意事项 文件字节输入流&#xff1a;每次读取多个字节 用到之前介绍过的常用方法&#xff1a; 实例演示 需求&#xff1a;用每次读取…

【泛微系统】e-cology非标配功能概览

关于泛微非标功能的功能编号、功能名称及支持版本 编号名称支持版本001考勤功能4.500.0124-9.00+KB900190206002短信通用接口5.000.0327+KB50001003 及以上版本004计划任务接口5.0+KB50001003及以上版本005集成登录接口6.0及以上版本006流程中自定义浏览框5.0+KB50001003及以上…

小程序项目业务逻辑回忆4

用户查询积分 积分获取规则如下: 邀请其他用户购票参会,将获取该用户花费金额的10%获取积分。 邀请用户注册参观展览&#xff0c;需注册并现场签到&#xff0c;将获取10分的奖励积分。 邀请企业用户参展&#xff0c;将获取企业参展金额的5%获取到积分。 上述3条积分获取规…

诸茅的黄昏

内容提要 白酒大陆的坍塌终于到达茅台的地盘&#xff0c;一切发生得太快了。突然间&#xff0c;深厚的护城河消失了&#xff0c;医药茅、眼科茅、牙科茅、疫苗茅、酱油茅都挣扎于内需的泥沼中。旧茅衰退&#xff0c;新茅生长&#xff0c;在下行周期&#xff0c;内需仍有结构性…

c++中的substr函数

在C++中,substr() 是 std::string 类的一个成员函数,用于从字符串中提取子字符串。以下是 substr() 函数的一些基本用法: 语法 substr(size_t pos = 0, size_t len = npos) pos 是子字符串开始的位置(基于 0 的索引)。如果不提供,它默认为 0,即从字符串的开头开始。le…

C#修改 EXE 文件图标和 winForm 窗口图标

修改 EXE 文件图标 1.准备好图片&#xff0c;转换为 Icon 图片&#xff1b; 2.右键工程&#xff0c;选择属性&#xff1b; 3.选择 Icon 图标即可&#xff1b; 4.重新生成可执行文件&#xff0c;查看。 修改 winForm 窗口图标 1.选中 winForm &#xff0c;查看属性&#x…

计算机的发展简史

目录 1. 计算机的五代变化 2. 半导体存储器的发展 3. 微处理器的发展 4. 计算机的性能指标 总结 计算机的发展史是一部技术革新与应用拓展的壮丽篇章。自20世纪中叶以来&#xff0c;计算机经历了五代变革&#xff0c;每一代都带来了性能的飞跃和使用模式的变革。同时&…

「51媒体」时尚类媒体邀约宣发资源

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 时尚类媒体邀约宣发资源可以多样化且针对性地满足品牌或活动的推广需求。以下是一些主要的资源及其特点&#xff1a; 时尚杂志&#xff1a;国内外知名时尚杂志&#xff0c;如《Vogue》、…

关于单片机那些事?

周期 时钟周期&#xff1a;也叫振荡周期&#xff0c;就是单片机外接晶振的倒数&#xff0c;如12Mhz&#xff0c;周期就是1/12us&#xff0c;最小的时间单位。频率越高&#xff0c;速度越快 指令周期&#xff1a;执行一条指令需要的时间&#xff0c;一般由若干个机器周期组成 …

【单片机】msp430g2553单片机, 用TA0定时器,让小灯P1.6呼吸灯,P1.6是TA0.1

要实现用MSP430G2553单片机的TA0定时器控制P1.6&#xff08;TA0.1&#xff09;的呼吸灯效果&#xff0c;可以按照以下步骤进行&#xff1a; 配置时钟系统&#xff1a;设置时钟源和分频器&#xff0c;以便定时器工作在合适的频率。 配置P1.6引脚&#xff1a;将P1.6引脚设置为TA…

【代码随想录训练营】【Day 52】【动态规划-11】| Leetcode 1143, 1035, 53,392

【代码随想录训练营】【Day 52】【动态规划-11】| Leetcode 1143, 1035, 53&#xff0c;392 需强化知识点 题目 1143. 最长公共子序列 注意还是要从0-i-1, 0-j-1 定义&#xff0c;因为我们需要遍历 0 class Solution:def longestCommonSubsequence(self, text1: str, text…

手机怎么自动切换ip地址

在数字化时代&#xff0c;网络IP地址不仅是设备在网络世界的标识&#xff0c;也是确保用户网络安全和数据隐私的关键因素。对于手机用户来说&#xff0c;在某些情境下可能需要自动切换IP地址&#xff0c;本文将为您介绍手机怎么自动切换IP地址。 随着网络技术的发展&#xff0c…

一些使用注意(XPTable控件使用说明十)

当XPTABLE放到线程中&#xff0c;列数据很多&#xff0c;不出现滚动条的解决代码&#xff1a; /// 这里神奇的代码&#xff0c;解决线程中XPTABLE 不出滚动条问题 , 执行UI相关的操作this.Invoke(new Action(() >{ // 列头&#xff0c;一行空的&#xff0c;这里列头设置…

前端面试题(基础篇六)

一、什么是事件代理 事件代理&#xff08;Event Delegation &#xff09;&#xff0c;又称事件委托。是JavaScript中常用的绑定事件的技巧。顾名思义&#xff0c;事件代理就是将原本要绑定的事件委托给父元素&#xff0c;让父元素担当事件监听的职务。原理就是DOM元素的事件冒…

蓝桥杯 经典算法题 求解完全背包问题

题目&#xff1a; 题解&#xff1a; 和01背包基本完全一样。小局部最优的策略也是一样&#xff1a;是否选当前局部的最后一项。唯一的不同点在于物品是无线的导致在表示选择当前物品的状态写法发生了改变&#xff1a;由dp[i-1][j-w[i]]变为了dp[i][j-w[i]]因为这样能够表示最后…

读AI新生:破解人机共存密码笔记08超级智能

1. 发现动作 1.1. 时间跨度长的智能行为&#xff0c;需要具备在多个抽象层次上分层规划和管理活动的能力&#xff0c;从攻读博士学位&#xff08;可能涉及1万亿个动作&#xff09;&#xff0c;到给一根手指发送一个运动控制指令&#xff0c;从而键入求职信的字符&#xff0c;无…