强调下面所有操作都基于把大数 按 低位到高位 由0~n 存在数组中进行。
string a;
cin>>a;
vector<int> A;
for(int i=a.sizee()-1;i>=0;i--) A.push_back(a[i]-'0');
且输出的时候 要逆序输出
//C作为结果
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
高精度加法:大数+大数
思路: 数组存储 一位一位加 需要注意的是 进1操作
//c=a+b
vector<int> add(vector<int>&A,vector<int>&B)
{
if(A.size()<B.size()) return add(B,A);高位加低位 具体原因和下面操作有关
vector<int> C;
int t=0;//作为进位的标志
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t=t/10;
}
if(t) C.push_back(t);
return C;
}
高精度乘法:大数*一个较小数
代码思路同上
vector<int> mul(vector<int>&A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i]*b;
C.push_back(t%10);
t=t/10;
}
if(t) C.push_back(t);
while(C.size()>1&&C.back()==0) C.pop_back();//去前缀0
return C;
}
高精度减法:大数减大数
bool 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)
{
if(!cmp(A,B)) return sub(B,A)
vector<int> C;
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);//注意这里加10的妙处
if(t<0) t=1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();//去前缀0
return C;
}
注意:输出时
if(!cmp(A,B)) cout<<"-";
高精度除法:大数/小数
注意:这里是从高位开始操作
vector<int> div(vector<int>&A,int b,int r)//r表示余数
{
vector<int> C;
r=0;
for(int i=A.size()-1;i>=0;i--)
{
r=r*10+A[i];//上一位留下来的 需要*10处理
C.push_back(r/b);
r=r%b;
}
reverse(C.bbegin(),C.end());//因为上面的操作 导致这里是低位在后 就需要颠倒 来进行统一
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}