高精度加法、减法、乘法、除法(高精除以低精) 模块化函数

加法

一、函数传入char[],返回string

#include<iostream>
#include<cstring>
using namespace std;

string prec_plus(char plus_s1[10100],char plus_s2[10100]){
	int plus_i1[10100],plus_i2[10100];
	int l1=strlen(plus_s1),l2=strlen(plus_s2);
	string ans="";
	int len=max(l1,l2);
	
	memset(plus_i1,0,sizeof(plus_i1));
	memset(plus_i2,0,sizeof(plus_i2));

	for(int i=l1-1;i>=0;i--)//倒序赋值 char->int 
		plus_i1[l1-i-1]=plus_s1[i]-'0';
	for(int i=l2-1;i>=0;i--)
		plus_i2[l2-i-1]=plus_s2[i]-'0';
	for(int i=0;i<len;i++){
		plus_i1[i]+=plus_i2[i];
		plus_i1[i+1]+=plus_i1[i]/10;//进位
		plus_i1[i]%=10;
	}
	if(plus_i1[len]!=0) len++;//判断首位是否进位 

	while(plus_i1[len-1]==0 and len>1)
		len--;//去0 
		
	for(int i=len-1;i>=0;i--)
		ans=ans+char(plus_i1[i]+'0');
	return ans;
}

int main(){
	char s1[10100],s2[10100];
	while(cin>>s1>>s2)
		cout<<prec_plus(s1,s2)<<endl;
	return 0;
}

二、函数传入string,返回string

#include<iostream>
#include<cstring>
using namespace std;

string prec_plus(string plus_s1,string plus_s2){
	int plus_i1[10100],plus_i2[10100];
	int l1=plus_s1.length(),l2=plus_s2.length();
	string ans="";
	int len=max(l1,l2);
	
	memset(plus_i1,0,sizeof(plus_i1));
	memset(plus_i2,0,sizeof(plus_i2));

	for(int i=l1-1;i>=0;i--)//倒序赋值 char->int 
		plus_i1[l1-i-1]=plus_s1[i]-'0';
	for(int i=l2-1;i>=0;i--)
		plus_i2[l2-i-1]=plus_s2[i]-'0';
	for(int i=0;i<len;i++){
		plus_i1[i]+=plus_i2[i];
		plus_i1[i+1]+=plus_i1[i]/10;//进位
		plus_i1[i]%=10;
	}
	if(plus_i1[len]!=0) len++;//判断首位是否进位 

	while(plus_i1[len-1]==0 and len>1)
		len--;//去0 
		
	for(int i=len-1;i>=0;i--)
		ans=ans+char(plus_i1[i]+'0');
	return ans;
}

int main(){
	string s1,s2;
	while(cin>>s1>>s2)
		cout<<prec_plus(s1,s2)<<endl;
	return 0;
}

减法(只提供string => string版本,char[]可自行改写)

string prec_minus(string minus_s1,string minus_s2){ 
	int minus_i1[10100],minus_i2[10100];
	int l1=minus_s1.length(),l2=minus_s2.length();
	string ans="";
	int len=max(l1,l2);
	
	memset(minus_i1,0,sizeof(minus_i1));
	memset(minus_i2,0,sizeof(minus_i2));

	for(int i=l1-1;i>=0;i--)//倒序赋值 char->int 
		minus_i1[l1-i-1]=minus_s1[i]-'0';
	for(int i=l2-1;i>=0;i--)
		minus_i2[l2-i-1]=minus_s2[i]-'0';
	for(int i=0;i<len;i++){
		minus_i1[i]-=minus_i2[i];
		if(minus_i1[i]<0){
			minus_i1[i]+=10;
			minus_i1[i+1]--;
		}
	}

	while(minus_i1[len-1]==0 and len>1)
		len--;//去0 
		
	for(int i=len-1;i>=0;i--)
		ans=ans+char(minus_i1[i]+'0');
	return ans;
}

乘法

string prec_multiply(string multiply_s1,string multiply_s2){ 
	int multiply_i1[1010],multiply_i2[1010],multiply_i3[1010];
	int l1=multiply_s1.length(),l2=multiply_s2.length();
	string ans="";
	int len=(l1+l2);
	
	memset(multiply_i1,0,sizeof(multiply_i1));
	memset(multiply_i2,0,sizeof(multiply_i2));
	memset(multiply_i3,0,sizeof(multiply_i3));
	
	for(int i=l1-1;i>=0;i--)//倒序赋值 char->int 
		multiply_i1[l1-i-1]=multiply_s1[i]-'0';
	for(int i=l2-1;i>=0;i--)
		multiply_i2[l2-i-1]=multiply_s2[i]-'0';
		
	for(int i=0;i<l1;i++){
		for(int j=0;j<l2;j++){
			multiply_i3[i+j]+=multiply_i1[i]*multiply_i2[j];
			multiply_i3[i+j+1]+=multiply_i3[i+j]/10;
			multiply_i3[i+j]%=10;
		}
	}

	while(multiply_i3[len-1]==0 and len>1)
		len--;//去0 
		
	for(int i=len-1;i>=0;i--)
		ans=ans+char(multiply_i3[i]+'0');
	return ans;
}

除法(高精除以低精)

#include<iostream>
#include<cstring> 
using namespace std;
string prec_division(string div_s1,int div_i2){
	int div_i1[10100];
	memset(div_i1,0,sizeof(div_i1));
	int l1=div_s1.length();
	for(int i=0;i<l1;i++)
		div_i1[i]=div_s1[i]-'0';
	int div_t=0;
	for(int i=0;i<l1;i++){
		div_t=div_t*10+div_i1[i];
		div_i1[i]=div_t/div_i2;
		div_t%=div_i2;
	}
	bool div_f=false;
	string ans;
	for(int i=0;i<l1;i++){
		if(div_i1[i]) div_f=true;
		if(div_f or i==l1-1) ans=ans+char(div_i1[i]+'0');
	}
	return ans;
}
int main(){
	string s1;
	int i2;
	while(cin>>s1>>i2)
		cout<<prec_division(s1,i2)<<endl;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值