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;
}

全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务