本次大数运算不包含负数
大数的读入和打印:
vector<int> a,c;//用vector存储大数
string x;//字符串读入
cin>>x;//大数用string读入
for(int i=x.size()-1;i>=0;i--) a.push_back(x[i]-'0');//大数读入,把字符串转化成大数
for(int i=c.size()-1;i>=0;i--) printf("%d",c[i]);//大数打印,反位存储,反位输出 大数+大数 vector<int> add(vector<int> &A,vector<int> &B){//大数+大数,用引用是为了节约空间
vector<int> ans;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++){
if(i<A.size()) t+=A[i];//如果a可以达到这个位数
if(i<B.size()) t+=B[i];
ans.push_back(t%10);
t/=10;//满10进位
}
if(t) ans.push_back(t);//如果最高位还有进位,补上
return ans;
} 大数-大数 bool isABig(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>=0;i--)//长度一样从高位开始循环比较
if(a[i]!=b[i]) return a[i]>b[i];
return true;//a==b 返回真
}
vector<int> sub(vector<int> &a,vector<int> &b){//大数-大数
vector<int> c;
if(isABig(a,b)){//如果a>=b
int t=0;//t为低位的情况,是否借位
for(int i=0;i<a.size();i++){
t+=a[i];
if(i<b.size()) t-=b[i];
c.push_back((t+10)%10);//t>=0和t<0的情况都包含进去了
if(t<0) t=-1;
else t=0;
}
while(c.size()>1&&c.back()==0) c.pop_back();//去除前导0
return c;
}else{//a<b
printf("-");//打印减号
return sub(b,a);//-(b-a)
}
} 大数*int vector<int> mul(vector<int> &a,int b){//大数*int
vector<int> c;
int t=0;//t位低位情况,是否进位
for(int i=0;i<a.size()||t;i++){
if(i<a.size()) t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
return c;
}
大数/int vector<int> div(vector<int> &a,int b,int &r){//a/b,返回商,a是大数,b是int数,r是余数必须&
r=0;
vector<int> c;
for(int i=a.size()-1;i>=0;i--){
r=r*10+a[i];//前一位剩下的加上现位
c.push_back(r/b);
r%=b;
}
reverse(c.begin(),c.end());//反转,因为除法是从高位开始,加减乘是低位开始,所以pushback后要反转
while(c.size()>1&&c.back()==0) c.pop_back();//去除前导0
return c;
} 
京公网安备 11010502036488号