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

高精度与高精度的乘法---基础算法

看到一个博主写得不错,我也照猫画虎:)

原因

在计算两个非负整数时,如果位数很大,连 long long 类型都存储不了,就要使用到高精度的乘法

原理

原理依旧是模拟人计算两个数的积,早在小学我们已经学了竖式运算,如图:

你有没有从中发现什么,个位与个位的乘积在积的个位上,个位与十位的乘积在积的十位上……我们先将所有的乘积保存下来(用一个数组保存),然后对它进行进位处理就可以得到结果。

另外结果的长度是多少呢?可以从上图得出,不管怎么样,长度的基础是其中一个数的长度,另外一个数的长度是乘的次数,第一次乘不会向左移,所以最终的长度是:数A 的长度 + 数 B的长度 - 1。

步骤

先将数 A 数 B 存储

再将 A、B 每一位的乘积用数组存储

然后对数组进行进位处理,将结果放进答案动态数组

最后打印就好了

代码

#include <iostream>
#include <vector>
#include <string>using namespace std;int c[200]; //A和B的位数都小于100位,存储着各个位上的乘积和vector <int> mul(vector <int>& A, vector <int>& B)
{vector <int> C;for (int i = 0; i < (int)A.size(); i++){for (int j = 0; j < (int)B.size(); j++){c[i + j ] +=( A[i] * B[j] ); // 下标从0开始,注意下标}}int t = 0; //表示进位for (int i = 0; i < (int)(A.size() + B.size()) ; i++) //结果的最大位数就是A.size() + B.size() - 1{t += c[i];C.push_back(t % 10);t  /=  10;}//我看到很多人的代码都有去前导0,可是乘法好像不会出现这种情况return C;
}int main(void)
{string a, b;cin >> a >> b;vector <int> A, B;for (int i = (int)a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //逆序存储for (int i = (int)b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');auto C = mul(A, B);for (int i = (int)C.size() - 1; i >= 0; i--) //逆序打印{cout << C[i];}return 0;}
http://www.lryc.cn/news/188443.html

相关文章:

  • 护眼灯有效果吗?科普护眼灯的作用与推荐
  • 【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)
  • HDLbits: Lfsr5
  • Visual Studio 错误CS0006:未能找到元数据文件踩坑记录
  • tcpdump(三)命令行参数讲解(二)
  • 面试算法25:链表中的数字相加
  • APP如何设计应用的屏幕截图以提高下载量
  • qt 关于自定义控件,然后其他页面提升后背景样式表不生效问题
  • 对比纯软开与嵌入式硬件开发谁更好呢?
  • 软考 系统架构设计师系列知识点之软件质量属性(5)
  • 修改ubuntu服务器fs文件最大打开数
  • linux下Qt的pro文件
  • git常用命令和开发常用场景
  • 02 认识Verilog HDL
  • 解决VUE安装依赖时报错:npm ERR! code ERESOLVE
  • 软件公司的项目管理软件选择指南
  • 2、服务器安装docker
  • UDP报文结构
  • (高阶) Redis 7 第21讲 IO多路复用模型 完结篇
  • 2023年入职/转行网络安全,该如何规划?
  • 解密RabbitMQ:你所不知道的端口及其重要性
  • Docker 环境搭建 (centeros)
  • 服务器编程基本框架
  • Leetcode——数组的遍历系列练习
  • 免费的ChatGPT与StableDiffusion AI绘画 二合一 附在线地址
  • vivado FFT IP仿真(3)FFT IP选项说明
  • 正点原子嵌入式linux驱动开发——Busybox根文件系统构建
  • React闭包
  • 【VS Code】推荐一套我非常喜欢的主题和字体样式
  • 【SQL】MySQL中的约束