前言
采用c++的stl库实现高精度的加减乘除,以及求余运算,希望可以帮助到大家。
加法
string add_big(string a,string b){//string 加 string
vector<int>A,B,C;
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');
for(int i=0,t=0;i<A.size()||i<B.size()||t;++i){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
减法
bool cmp_str(string a,string b){//cmp string大小
if(a.size()!=b.size())return a.size()>b.size();
for(int i=0;a[i]!='\0';++i){
if(a[i]!=b[i])return a[i]>b[i];
}
return true;
}
string sub_big(string a,string b){//string a 减 string b
if(!cmp_str(a,b))return '-'+sub_big(b,a);
vector<int>A,B,C;
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');
int t=0;
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);
if(t<0)t=-1;
else t=0;
}
while(C.size()>1&&C.back()==0)C.pop_back();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
乘法
string * int
string mul_big(string a,int b){//string 乘 int
vector<int>A,C;
for(int i=a.size()-1;i>=0;--i)A.push_back(a[i]-'0');
for(int i=0,t=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();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
string * string
string fun(int x){//补后缀
string s="";
for(int i=0;i<x;++i)s+="00000000";
return s;
}
int str_int(string s){//str转int
int res=0;
for(int i=0;i<s.size();++i)res=res*10+s[i]-'0';
return res;
}
string mul_str(string a,string b){//string 乘 string
string c="0";
vector<int>B;
if(b.size()%8!=0)B.push_back(str_int(b.substr(0,b.size()%8)));
for(int i=b.size()%8;i<b.size();i+=8){
B.push_back(str_int(b.substr(i,8)));
}
for(int i=B.size()-1,j=0;i>=0;--i,++j){
c=add_big(c,mul_big(a,B[i])+fun(j));
}
return c;
}
除法
string div_big(string a,int b,int& t){//string a 除 int b 余数为t
vector<int>A,C;
for(int i=0;i<a.size();++i)A.push_back(a[i]-'0');
t=0;
for(int i=0;i<A.size();++i){
t=t*10+A[i];
C.push_back(t/b);
t%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0)C.pop_back();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
求余
int mod_big(string a,int b){//string a mod int b
int m=0;
for(int i=0;i<a.size();++i){
m=(m*10+a[i]-'0')%b;
}
return m;
}
全部代码
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
//string 为正整数
string add_big(string a,string b){//string 加 string
vector<int>A,B,C;
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');
for(int i=0,t=0;i<A.size()||i<B.size()||t;++i){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
bool cmp_str(string a,string b){//cmp string大小
if(a.size()!=b.size())return a.size()>b.size();
for(int i=0;a[i]!='\0';++i){
if(a[i]!=b[i])return a[i]>b[i];
}
return true;
}
string sub_big(string a,string b){//string a 减 string b
if(!cmp_str(a,b))return '-'+sub_big(b,a);
vector<int>A,B,C;
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');
int t=0;
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);
if(t<0)t=-1;
else t=0;
}
while(C.size()>1&&C.back()==0)C.pop_back();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
string mul_big(string a,int b){//string 乘 int
vector<int>A,C;
for(int i=a.size()-1;i>=0;--i)A.push_back(a[i]-'0');
for(int i=0,t=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();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
string fun(int x){//补后缀
string s="";
for(int i=0;i<x;++i)s+="00000000";
return s;
}
int str_int(string s){//str转int
int res=0;
for(int i=0;i<s.size();++i)res=res*10+s[i]-'0';
return res;
}
string mul_str(string a,string b){//string 乘 string
string c="0";
vector<int>B;
if(b.size()%8!=0)B.push_back(str_int(b.substr(0,b.size()%8)));
for(int i=b.size()%8;i<b.size();i+=8){
B.push_back(str_int(b.substr(i,8)));
}
for(int i=B.size()-1,j=0;i>=0;--i,++j){
c=add_big(c,mul_big(a,B[i])+fun(j));
}
return c;
}
string div_big(string a,int b,int& t){//string a 除 int b 余数为t
vector<int>A,C;
for(int i=0;i<a.size();++i)A.push_back(a[i]-'0');
t=0;
for(int i=0;i<A.size();++i){
t=t*10+A[i];
C.push_back(t/b);
t%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0)C.pop_back();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
int mod_big(string a,int b){//string a mod int b
int m=0;
for(int i=0;i<a.size();++i){
m=(m*10+a[i]-'0')%b;
}
return m;
}
int main(){
string a,b;
int B,M;
/****** + ********/
cin>>a>>b;
cout<<add_big(a,b)<<endl;
/****** - ********/
cin>>a>>b;
cout<<sub_big(a,b)<<endl;
/****** * ********/
cin>>a>>B;
cout<<mul_big(a,B)<<endl;
cin>>a>>b;
cout<<mul_str(a,b);
/****** / ********/
cin>>a>>B;
cout<<div_big(a,B,M)<<" "<<M<<endl;
/****** % ********/
cin>>a>>B;
cout<<mod_big(a,B)<<endl;
return 0;
}