微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数加减乘除取余

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

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

函数参数为操作数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[],int radix);//c = a - b
void Dmul(const int a[],int radix);//c = a * b
void Ddiv(const int a[],int radix);//c = a / b
void Dmod(const int a[],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,10);//10进制 
		DigitToStr(c,str);
		cout<<"a - b = "<<str<<endl;
	}else{
		Dsub(b,a,str);
		cout<<"b - a = "<<str<<endl;
	}
	
	Dmul(a,str);
	cout<<"a * b = "<<str<<endl;
	
	Ddiv(a,str);
	cout<<"a / b = "<<str<<endl;
	
	Dmod(a,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[],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[],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[],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[],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,temp,radix);
				if(Dcmp(temp,a)>0){
					c[i]--;break;
				}
				c[i]++;
			}
		}
		while(c[c[0]]==0)c[0]--;
	}
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐