大数四则运算

#include
#include
#include
using namespace std;
#define M 1000000000000000
//大数加法
//将数字以字符串的形式传入add加法函数,在函数内部完成字符串->数组的转换,
//然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的 //前面,高位放在后面。
void add(char stra[],char strb[])
{
	int a[M],b[M];
	int i,maxlen,alen,blen;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	alen=strlen(stra);
	blen=strlen(strb);
	maxlen=alen>blen?alen:blen;
	
	for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据 
		a[alen-i]=stra[i]-'0';
	for(i=blen-1;i>=0;i--)
		b[blen-i]=strb[i];
		
	for(i=1;i9)
		{
			if(i==maxlen)
				maxlen++;
			a[i+1]++;
			a[i]%=10;
		}
	}
	for(i=maxlen;i>0;i--)
		printf("%d",a[i]);
}
//大数减法
//相减算法也是从低位开始减的。
//先要判断被减数和减数哪一个位数长,若被减数位数长是正常的减法;若减数位数长,则用被减数减去减数, 
//最后还要加上负号;当两数位数长度相等时,需要比较哪一个数字大,否则负号处理会很繁琐;这里以
//a[0]==1为前一项大于后一项;处理每一项时要,如果前相减小于0需要向前一位借1,
void subtract(char stra[],char strb[])
{
	int a[M],b[M];
	int i,maxlen,alen,blen;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	alen=strlen(stra);
	blen=strlen(strb);
	if(alen>blen){
		maxlen=alen;a[0]=1; 
	} 
	else if(alen==blen)
	{
		if(strcmp(stra,strb))
			a[0]=1;
		else
			a[0]=0;
	} 
	else
	{
		maxlen=blen;a[0]=0;
	}
	for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据 
		a[alen-i]=stra[i]-'0';
	for(i=blen-1;i>=0;i--)
		b[blen-i]=strb[i];
	for(i=1;i0;i--)
				printf("%d",a[i]);		
	}

	if(a[0]==0)
	{
			for(i=maxlen;b[i]!=0;i--);i++;
			for(i;i>0;i--)
				printf("%d",b[i]);		
	}

}

//计算的过程基本上和小学生列竖式做乘法相同。为了编程方便,并不急于处理进位,而是将进位问题留待最后
//统 一处理。
void cheng (char stra[],char strb[])
{
	int a[M],b[M],x=0,c[M];
	int j,i,maxlen,alen,blen;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	alen=strlen(stra);
	blen=strlen(strb);
	maxlen=alen>blen?alen:blen;
	
	for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据 
		a[alen-i]=stra[i]-'0';
	for(i=blen-1;i>=0;i--)
		b[blen-i]=strb[i];
		
	for(i=1;i9)
		{
			if(i==maxlen)
				maxlen++;
			x=a[i]/10;
			a[i]%=10;
		}
	}
		
	for(i=maxlen;i>0;i--)
		printf("%d",a[i]);	
}
//大数除法
//看了网上大多数的大数除法都是以递减的形式进行运算,我不喜欢这种方法,所以找了一种不能完全属于大    
//数的除法,具体方法以123/12位例,1/12=0~1,b[1]=0;  12/12=1~0 ,b[2]=1;    3/12=0~3,  
//b[3]=0;
//所以123/12=10~3;
void divide(char stra[],char strb[])
{
	int x=0,i,alen;
	long c;
	c=atol(strb);
	int a[M],b[M];
	memset(a,0,sizeof(a));
	alen=strlen(strb);
	for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据 
		a[alen-i]=stra[i]-'0';
	for(i=1;i<=alen;i++)
	{
		x=x*10+a[i];
		b[i]=x/c;
		x=x%c;
	}
	while(b[i]==0)
		i++;
	for(i;i<=alen;i++)
		printf("%d",b[i]); 
    printf("模为%d",x);
	
}

 

你可能感兴趣的:(大数四则运算)