高精度四则运算 (函数)

本文提供了以char型数组实现的高精度四则运算函数,包括加法、减法、乘法和初学者友好的大数除小数。通过模拟竖式运算,适合初学者学习参考。
摘要由CSDN通过智能技术生成

本人整理并编写高精度四则运算,以函数形式供大家参考

考虑到看此文章者多是初学者,全部以 char 型数组编写

加法

void pplus(char s1[],char s2[]){//加法
	int a1[4005],a2[2005];
	memset(a1,0,sizeof(a1));
	memset(a2,0,sizeof(a2));
	int l=min(strlen(s1),strlen(s2));
	int l_max=max(strlen(s1),strlen(s2));
	for(int i=0;i<strlen(s1);i++){
		a1[i]=s1[strlen(s1)-i-1]-'0';
	}
	for(int i=0;i<strlen(s2);i++){
		a2[i]=s2[strlen(s2)-i-1]-'0';
	}
	int jw=0;
	for(int i=0;i<=4005;i++){
		a1[i]+=a2[i]+jw;
		jw=a1[i]/10;
		a1[i]%=10;
	}
	bool flag=0;
	for(int i=l_max;i>=0;i--){
		if(a1[i]!=0||i==0) flag=true;
		if(flag) cout<<a1[i];
	}	
}

减法

bool Dayu(char s1[],char s2[]){//判断s1总值是否大于等于s2
	int a[2005],b[2005];
	if(strlen(s1)>=strlen(s2)) return true;
	else return false;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(int i=0;i<strlen(s1);i++){
		a[i]=s1[i]-'0';
	}
	for(int i=0;i<strlen(s2);i++){
		b[i]=s2[i]-'0';
	}
	if(strlen(s1)==strlen(s2)){
		for(int i=0;i<strlen(s1);i++){
			if(a[i]<b[i]) return false;
			else if(a[i]>b[i]) return true;
		}
	}
	return true;
}

void mminus(char s1[],char s2[]){//减法
	int a1[2005],a2[2005];
	memset(a1,0,sizeof(a1));
	memset(a2,0,sizeof(a2));
	for(int i=0;i<strlen(s1);i++){
		a1[i]=s1[strlen(s1)-i-1]-'0';
	}
	for(int i=0;i<strlen(s2);i++){
		a2[i]=s2[strlen(s2)-i-1]-'0';
	}
	//判断大小
	if(Dayu(s1,s2)){//s1>=s2
		for(int i=0;i<2000;i++){
			a1[i]=a1[i]-a2[i];
			if(a1[i]<0) {
				a1[i]+=10;
				a1[i+1]--;
			} 
		}
		bool flag=0;
		for(int i=strlen(s1);i>=0;i--){
			if(a1[i]!=0||i==0) flag=true;
			if(flag) cout<<a1[i];
		}
	}else{//s1<s2
		cout<<"-";
		for(int i=0;i<2000;i++){
			a2[i]=a2[i]-a1[i];
			if(a2[i]<0) {
				a2[i]+=10;
				a2[i+1]--;
			} 
		}
		bool flag=0;
		for(int i=max(strlen(s1),strlen(s2));i>=0;i--){
			if(a2[i]!=0||i==0) flag=true;
			if(flag) cout<<a2[i];
		}
	}
}

乘法

void mul(char s1[],char s2[]){//乘法
	int a1[2005],a2[2005];
	int ans[5005];
	memset(a1,0,sizeof(a1));
	memset(a2,0,sizeof(a2));
	memset(ans,0,sizeof(ans));
	for(int i=0;i<strlen(s1);i++){
		a1[i]=s1[strlen(s1)-i-1]-'0';
	}
	for(int i=0;i<strlen(s2);i++){
		a2[i]=s2[strlen(s2)-i-1]-'0';
	}
	for(int i=0;i<=strlen(s1);i++){
		for(int j=0;j<=strlen(s2);j++){
			ans[i+j]+=a1[i]*a2[j];
			if(ans[i+j]>=10){
				ans[i+j+1]+=ans[i+j]/10;
				ans[i+j]%=10;
			}
			
		}
	}
	bool flag=0;
	for(int i=strlen(s1)+strlen(s2)+1;i>=0;i--){
		if(ans[i]!=0||i==0) flag=true;
		if(flag) cout<<ans[i];
	}	
}

除法 (初学者掌握大数除小数即可)

void div(char s1[],int s2){//大数除小数,结果向下取整
	int a[2005];
	int ans[2005];
	memset(a,0,sizeof(a));
	for(int i=0;i<strlen(s1);i++){
		a[i]=s1[i]-'0';
	}
	int jw=0;
	for(int i=0;i<strlen(s1);i++){
		jw=jw*10+a[i];
		ans[i]=jw/s2;
		jw=jw%s2;
	}
	bool flag=0;
	for(int i=0;i<strlen(s1);i++){
		if(ans[i]!=0) flag=true;
		if(flag) cout<<ans[i];
	}
}

主函数

int main(){
	cin>>str1>>str2;
	//mminus(str1,str2);
	//mul(str1,str2);
	//pplus(str1,str2);
	//div(str1,b);         自选
	return 0;
}

主要思想大致一样,都是模拟竖式运算。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值