#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#define ll long long
#define up_b upper_bound
#define low_b lower_bound
#define m_p make_pair
#define mem(a) memset(a,0,sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#include<algorithm>
using namespace std;
//高精+高精
vector<int> addH(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
return C;
}
//高精+低精
vector<int> add(vector<int> &A,int b)
{
vector<int> C;
A[0]+=b;
for(int i=0,t=0;i<A.size()||t;i++)
{
t+=A[i];
C.push_back(t%10);
t/=10;
}
return C;
}
//高精*高精
vector<int> mulH(vector<int> &A,vector<int> &B)
{
int la=A.size(), lb=B.size();
vector<int> C(la+lb,0);
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++) C[i+j]+=A[i]*B[j];
int t=0;
for(int i=0;i<C.size();i++)//进位
{
t+=C[i];
C[i]=t%10;
t/=10;
}
while(C.back()==0&&C.size()>1) C.pop_back();//去零
return C;
}
//高精*低精
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
if(b==0) {
C.push_back(0); return C; }//特判
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;
}
return C;
}
//高精 ÷低精
vector<int> div(vector<int> &A,int b,int &r)//r为余数
{
vector<int> C;
r=0;
for(int i=A.size()-1;~i;i--)
{
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());//得到的顺序是由高位到低位,为了方便,反转C
while(C.back()==0&&C.size()>1) C.pop_back();//去零
return C;
}
//高精-高精
bool cmp(vector<int> &A,vector<int> &B)//比较A与B的大小
{
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=A.size()-1;~i;i--)
if(A[i]!=B[i]) return A[i]>B[i];
return true;
}
vector<int> subH(vector<int> &A,vector<int> &B) //满足A>=B>=0
{
vector<int> C;
for(int i=0,t=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.back()==0&&C.size()>1) C.pop_back();
return C;
}
//高精度比较
vector<int> max_vec(vector<int> &A,vector<int> &B)
{
if(A.size()>B.size()) return A;
if(A.size()<B.size()) return B;
//由高到低比较
if(vector<int> (A.rbegin(),A.rend()) > vector<int> (B.rbegin(),B.rend())) return A;
return B;
}
int main()
{
string a;string b;//int b;
vector<int> A,B,C;
cin>>a>>b;
for(int i=a.length()-1;~i;i--) A.push_back(a[i]-'0');
for(int i=b.length()-1;~i;i--) B.push_back(b[i]-'0');
//加
C=addH(A,B);
for(int i=C.size()-1;~i;i--) cout<<C[i];
//减
if(cmp(A,B)) C=subH(A,B);
else putchar('-'), C=subH(B,A);
for(int i=C.size()-1;~i;i--) cout<<C[i];
//乘
C=mulH(A,B);
for(int i=C.size()-1;~i;i--) cout<<C[i];
//除
//int r;
//C=div(A,b,r);
//for(int i=C.size()-1;~i;i--) cout<<C[i];cout<<endl<<r;*/
return 0;
}
Study notes: high precision [template] (vecor implementation)
Guess you like
Origin blog.csdn.net/m0_50815157/article/details/113359012
Recommended
Ranking