基础算法(二)
高精度加减乘除
高精度加法

因为整数的长度大于1e5所以利用输入字符串的方式,将大整数从字符串转移到数组中
进行加减
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B){// 此处注意传递向量AB引用是因为可以加快运算速率
vector<int>C;
int t=0;//进位初始化为0
if(A.size()<B.size())return add(B,A);//此步为保证数组A长度比B长
for(int i=0;i<A.size();i++){
t+=A[i];
if(i<B.size())t+=B[i];//t同时作为sum值;
C.push_back(t%10);
t=t/10;//更新进位大小
}
if(t)C.push_back(t);//加入最高位进位
return C;
}
int main(){
string a,b;
cin>>a>>b;
vector<int>A,B;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
return 0;
}
高精度减法

与加法思路基本一致,但是要首先考虑AB大小问题以及减出来是否为负数的问题
包括最后去除掉C中多余0
#include<vector>
#include<iostream>
using namespace std;
//A>=B return true
int cmp(vector<int>&A,vector<int>&B){
if(A.size()!=B.size())return A.size()>B.size();
for(int i=A.size()-1;i>=0;i++){
if(A[i]!=B[i])return A[i]>B[i];
}
return true;
}
vector<int> sub(vector<int>&A,vector<int>&B){
int t=0;
vector<int>C;
for(int i=0;i<A.size();i++){
t=A[i]-t;
if(i<B.size())t-=B[i];
C.push_back((t+10)%10);//如果减掉B[i]之后t为负数,则t为原值加上10,否则t+10模10仍然为原来的值
if(t<0)t=1;//重置进位
else t=0;
}
while(C.size()>1&&C.back()==0)C.pop_back();//拿掉结果中多余的0,,,如111-110=001把他变为1而不是001
}
int main(){
string a,b;
cin>>a>>b;
vector<int>A,B;
for(int i=A.size()-1;i>=0;i--)A.push_back(a[i]-'0');
for(int i=B.size()-1;i>=0;i--)A.push_back(b[i]-'0');
if(cmp(A,B))
auto C=sub(A,B);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
}
else{
auto C =sub(B,A);
printf("-");
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
}
高精度乘法

//高精度乘法
大数A乘以小数b
思路同加法一致
唯一需要注意的是高精度乘法是每一位与b整个相乘,而不是小学那种算法
#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int>&A,int b){
vector<int>C;
int t=0;
for(int i=0;i<A.size()|t;i++){//如果i小于A的位数或者依然存在进位t则循环继续
if(i<A.size())t=A[i]*b+t;
C.push_back(t%10);
t=t/10;
}
return C;
}
int main(){
string a;
cin>>a;
int b;
cin>>b;
vector<int>A;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
auto C=mul(A,b);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
return 0;
}
高精度除法

//高精度除法定义一余数t,应注意与加减乘不同,除操作从最高位开始
并且存进去的向量C在最后应做倒序和去除前缀0操作
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//参数分别是被除数,除数,余数
vector<int> div(vector<int>&A,int b,int &t){
vector<int>C;
t=0;
for(int i=A.size()-1;i>=0;i--){
t=A[i]+t*10;//余数设置成当前位+t*10(前一位余数)
C.push_back(t/b);//商
t=t%b;//余数
}
reverse(C.begin(),C.end());//倒置C
while(C.size()>1&&C.back()==0)C.pop_back();//除0
return C;
}
int main(){
string a;
int b;
vector<int>A;
cin>>a>>b;
int t;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
auto C=div(A,b,t);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
printf("\n%d",t);
return 0;
}

浙公网安备 33010602011771号