acwing791/2/3/4,高精度,大数的加减乘除
本次大数运算不包含负数
大数的读入和打印:
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; }