[编程笔记]-High_Precision(Mul and Div)[SIM]高精度乘除法(基础版)

前言

鉴于此篇博客用于学习or巩固基础部分,故而这里只记录大数与int类型的小数的乘除计算,大数乘大数将会在“[编程笔记]-High_Precision(Mul and Div)[COM]高精度乘除法(提高版)”教学。

emmm就这样吧(。·ω·。)

思路

乘法

其实就跟列竖式差不多,把大数列在下面、小数列在上面,直接乘。

别忘了去前导0~

除法

就是用机器去模拟手写嘛。鉴于除法相较于其他三种计算有些复杂,这里给出详细步骤:

  1. 准备好记录结果与记录余数的变量。
  2. 从最高位开始往最低位遍历大数。
  3. 将余数乘十并加上大数的这一位,作为新的被除数。
  4. 记录新的被除数除以小数的商与新余数。
  5. 去掉前导零。

tips: 如果你用的是vector储存,请在第5步前反转队列。(详见代码)

代码

乘法

1
2
3
4
5
6
7
8
9
10
vector<int> mul(vector<int> a,int b){
vector<int> c;int t=0;
for(int i=0;i<a.size()||t;i++){
if(i<a.size())t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
while(c.size()>1&&c.back()==0)c.pop_back();
return c;
}

除法

1
2
3
4
5
6
7
8
9
10
11
pair<vector<int>,int> div(vector<int> &a,int &b){//同时返回结果和余数
vector<int> c;int t=0;
for(int i=a.size()-1;i>=0;i--){
t=t*10+a[i];
c.push_back(t/b);//注意,这里是从最高位开始往最低位储存,所以最后要先反转过来。
t%=b;
}
reverse(c.begin(),c.end());//记得#include<algorithm>
while(c.size()>1&&c.back()==0)c.pop_back();
return {c,t};
}

完结撒花o( ̄︶ ̄)o


[编程笔记]-High_Precision(Mul and Div)[SIM]高精度乘除法(基础版)
http://githarlem.github.io/2024/07/29/High-Precision-MulDiv-Simple/
作者
Harlem
发布于
2024年7月29日
更新于
2024年7月30日
许可协议