基础算法(二)

高精度加减乘除

高精度加法

在这里插入图片描述
因为整数的长度大于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;
}
posted @ 2019-10-15 19:55  zzcxxoo  阅读(101)  评论(0)    收藏  举报