大数四则运算

#include<iostream>
#include<cstdlib>
#include<cstring>
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;i<maxlen;i++)
	{
		a[i]+=b[i];
		if(a[i]>9)
		{
			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;i<maxlen;i++)
	{
		if(a[0]==1)
		{
			a[i]-=b[i];
			if(a[i]<0)
			{
				a[i+1]--;
				a[i]+=10;
			}
		}
		if(a[0]==1)
		{
			b[i]-=a[i];
			if(a[i]<0)
			{
				b[i+1]--;
				b[i]+=10;
			}
		}
	}
	printf("-") ;
	if(a[0]==1)
	{
			for(i=maxlen;a[i]!=0;i--);i++;
			for(i;i>0;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;i<maxlen;i++)
	{
		for(j=i;j<maxlen;j++)
		{
			c[j]+=a[j]*b[i];
		}
		
	}
	
	for(i=1;i<maxlen;i++)
	{
		a[i]+=x;
		if(a[i]>9)
		{
			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);
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值