大数加减乘除取余

除了除法取模两个函数,每个运算函数不依赖其它函数;

减法函数只支持较大的数减去较小的数;

函数参数为操作数a,操作数b,存放结果c,进制 radix 推荐设为10;

大数格式为,a[0] 表示位数,a[1] 存放个位,依次存放高位

main 为测试函数;

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

void StrToDigit(const char c[],int a[]);
void DigitToStr(const int a[],char c[]);
int  Dcmp(const int a[],const int b[]);//return a - b
void Dadd(const int a[],const int b[],int c[],int radix);//c = a + b
void Dsub(const int a[],const int b[],int c[],int radix);//c = a - b
void Dmul(const int a[],const int b[],int c[],int radix);//c = a * b
void Ddiv(const int a[],const int b[],int c[],int radix);//c = a / b
void Dmod(const int a[],const int b[],int c[],int radix);//c = a % b;

int main(void){
	int a[100],b[100],c[100];
	char str[100];
	
	cout<<"input a:"; 
	cin>>str;
	StrToDigit(str,a);
	
	cout<<"input b:";
	cin>>str;
	StrToDigit(str,b);
	
	Dadd(a,b,c,10);//10进制 
	DigitToStr(c,str);
	cout<<"a + b = "<<str<<endl;
	
	if(Dcmp(a,b)>=0){
		Dsub(a,b,c,10);//10进制 
		DigitToStr(c,str);
		cout<<"a - b = "<<str<<endl;
	}else{
		Dsub(b,a,c,10);//10进制 
		DigitToStr(c,str);
		cout<<"b - a = "<<str<<endl;
	}
	
	Dmul(a,b,c,10);//10进制 
	DigitToStr(c,str);
	cout<<"a * b = "<<str<<endl;
	
	Ddiv(a,b,c,10);//10进制 
	DigitToStr(c,str);
	cout<<"a / b = "<<str<<endl;
	
	Dmod(a,b,c,10);//10进制 
	DigitToStr(c,str);
	cout<<"a % b = "<<str<<endl;
	
	return 0;
} 

void StrToDigit(const char c[],int a[])
{
	a[0]=0;
	while(c[a[0]]!='\0')
		a[0]++;  //	a[0]=strlen(c);
	int i;
	for(i=1;i<=a[0];i++){
		a[i]=c[a[0]-i]-'0';
	}
}
void DigitToStr(const int a[],char c[])
{
	int i;
	for(i=0;i<a[0];i++){
		c[i]=a[a[0]-i]+'0';
	}
	c[i]='\0';
}
int Dcmp(const int a[],const int b[])
//return a-b;
{
	int flag;
	if(a[0]==b[0]){
		int i = a[0];
		for(;i>=1;i--){
			if(a[i]!=b[i])
				break;
		}
		flag = a[i]-b[i];
	}else flag = a[0]-b[0];
	return flag;
}

void Dadd(const int a[],const int b[],int c[],int radix)
// c = a + b; radix 为进制,a[0] 为位数  
{
	int i;
	for(i=1;i<=a[0] || i<=b[0] ;i++){
		c[i] = 0;
		if(i<=a[0])
			c[i] += a[i];
		if(i<=b[0])
			c[i] += b[i];
	}
	c[0] = i;
	c[i] = 0;
	
	for(i=1;i<c[0];i++)
	{
		c[i+1] += c[i]/radix;
		c[i] = c[i]%radix;
	}
	while(c[c[0]]==0){
		c[0]--;
	}
}

void Dsub(const int a[],const int b[],int c[],int radix)
// c = a - b; a > b ; radix 为进制,a[0] 为位数  ,
{
	int i;
	for(i=0;i<=a[0];i++)c[i]=a[i];
	for(i=1;i<=c[0];i++){
		if(i<=b[0]){
			if(c[i]>=b[i])c[i] -= b[i];
			else{
				c[i+1]--;
				c[i] += radix;
				c[i] -= b[i];
			}
		}else{
			if(c[i]>=0)break;
			c[i] += radix;
			c[i+1] --;
		}
	}
	while(c[c[0]]==0){
		c[0]--;
	}
}

void Dmul(const int a[],const int b[],int c[],int radix)
// c = a * b; radix 为进制,a[0] 为位数  
{
	int i,j;
	c[0]=a[0]+b[0];
	for(i=1;i<=c[0];i++)c[i]=0;
	for(i=1;i<=a[0];i++){
		for(j=1;j<=b[0];j++){
			c[i+j-1] += a[i]*b[j];
		}
	}
	
	for(i=1;i<c[0];i++)
	{
		c[i+1] += c[i]/radix;
		c[i] = c[i]%radix;
	}
	while(c[c[0]]==0){
		c[0]--;
	}
} 

void Ddiv(const int a[],const int b[],int c[],int radix)
// c = a / b; radix 为进制,a[0] 为位数 ,用到了 Dcmp 、Dmul 函数 
{
	if(Dcmp(a,b)<0){//if(a<b)
		c[0]=1;c[1]=0;
	}else if(Dcmp(a,b)==0){
		c[0]=1;c[1]=1;
	}else{
		int i;
		int temp[a[0]+2];
		c[0] = a[0]-b[0]+1;
		for(i=1;i<=c[0];i++)c[i]=0;
		for(i = c[0];i>=1;i--){
			while(1){
				Dmul(b,c,temp,radix);
				if(Dcmp(temp,a)>0){
					c[i]--;break;
				}
				c[i]++;
			}
		}
		while(c[c[0]]==0)c[0]--;
	}
}

void Dmod(const int a[],const int b[],int c[],int radix)
// c = a % b;
{
	int temp[a[0]+1];
	int temp2[a[0]+1];
	Ddiv(a,b,temp,radix);
	Dmul(temp,b,temp2,radix);
	Dsub(a,temp2,c,radix);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值