一、高精度加法
cur=cur+now
vector<int> cur;
vector<int> now;
//cur和now已经逆序存放,目的将cur+now结果存入cur中
int x=0;
int i=0;
while(i<cur.size()&&i<now.size()){
cur[i]=cur[i]+now[i]+x;
x=cur[i]/10;
cur[i]=cur[i]%10;
++i;
}
//cur小的时候
if(i==cur.size()){
for(;i<now.size();++i){
int temp=now[i]+x;
cur.push_back(temp%10);
x=temp/10;
}
}
if(x)
cur.push_back(x);
//cur是最终结果
二、高精度减法
c=a-b
int a[100]={};
int b[100]={};
int c[100]={};
逆序存储a和b
if(a<b){//伪代码,保证a是被减速
flag=true;
swap(a,b);
}
while(c_len<=a_len||c_len<=b_len){
if(a[c_len]<b[c_len]{
a[c_len]+=10;
a[c_len+1]--;
}
c[c_len]=a[c_len]-b[c_len];
c_len++;
}
while(c[c_len]==0&&c_len>0) --c_len;//前面的0是无效的,如果结果是0需要保存
/*if(flag) 添加负号*/
三、高精度乘法
c=a*b
int a[100]={};
int b[100]={};
int c[200]={};
逆序存储a和b
for(int i=0;i<a_len;++i){//让a当做乘数,一位一位乘
int x=0; //每次乘都有一个进位
for(int j=0;j<b_len;++j){
c[i+j]+=x+a[i]*b[j];//c[k]表示结果中逆序第k+1位的数字,需要累加起来
x=c[i+j]/10;
c[i+j]%=10;
}
c[i+b_len]+=x;//最后的进位,当时进位可以是0,少个判断直接相加。
}
c_len=a_len+b_len-1;//最大位数-1 但是不一定
while(c[c_len]==0&&c_len>0) --c_len;
//至此0~c_len为所求结果
四、高精度除法
4.1、除以低精度
c=a/b
int a[200]={};
int b;
int c[100]={};
正序存储a,确保b不为0
int x=0;
for(int i=0;i<a_len;++i){
c[i]=(x+a[i])/b;
x=(x+a[i])%b;
x*=10;
}
int j=0;
while(c[j]==0&&j<a_len-1) ++j;
//至此j~a_len-1为所求结果
4.2、除以高精度
q=a/b····res
#include<bits/stdc++.h>
using namespace std;
vector<int> a;
vector<int> b;
int divide(vector<int> & res,vector<int> & b){//保证够减,高精度减 模拟 一次除法
int num=0;
vector<int> x=b;
reverse(x.begin(),x.end());
while(res.size()>b.size()||(res.size()==b.size()&&res>=b)){
reverse(res.begin(),res.end());
vector<int> c;
++num;
for(int i=0;i<res.size();++i){
if(res[i]<x[i]){
res[i]+=10;
res[i+1]--;
}
c.push_back(res[i]-x[i]);
}
while(c.size()>0&&c[c.size()-1]==0) c.pop_back();//为0的余数不要了,原因是我们的res会继续为后面的除法做贡献,前导0对后续除法来说无意义,甚至影响判断~
res=c;
reverse(res.begin(),res.end());
}
return num;
}
int main(void){
/*--------------初始化-----------------*///确保初始化没有前导0。
string s;
cin>>s;
for(int i=0;i<s.size();++i)
a.push_back(s[i]-'0');
cin>>s;
for(int i=0;i<s.size();++i)
b.push_back(s[i]-'0');
/*--------------除法-----------------*/
vector<int> res;//余数
vector<int> q;//商
for(int i=0;i<a.size();++i){
res.push_back(a[i]);
if(res.size()<b.size()){//位数不够
q.push_back(0);
}else{
if(res.size()==b.size()&&res<b){//位数刚好够,但是没它大
q.push_back(0);
}else{
q.push_back(divide(res,b));//返回商,并且引用式参数,余数res会自动更改。
}
}
}
//余数为空,则余数为0
int j=0;
while(j<q.size()-1&&q[j]==0)
++j;
vector<int> temp(q.begin()+j,q.end());
swap(q,temp);
//q是商
}