大数的加减法操作(C代码)

网上有关大数加减法操作的代码多是不带符号进行运算的,自己写了一个带符号的版本,供学习和参考,代码里面注释很详细,直接上代码

#include <stdio.h>
#include <string.h>
#define M 100 //定义了数量M是100作为数组初始化的数量 
typedef struct bigint{
	char num[M];
	int symbol;		//symbol是符号 0:+  1:-
}Bigint,*pBigint; 

int addnum(const char s1[], const char s2[], char result[]){    //单纯的不带符号数据的加法
	int i, j, len_s1, len_s2;    
	int num1[M] = {0};           // 数字数组num1 (不带符号) 
	int num2[M] = {0};           // 数字数组num2 (不带符号)
	int ans[M] = {0};			//数字数组(不带符号)
	len_s1 = strlen(s1);         //	求第一个加数的位数 (带符号) 
	len_s2 = strlen(s2);
	for(i=len_s1-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第一个数 
	{
		num1[j] = s1[i] - '0';
		j++;
	}
	for(i=len_s2-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第二个数 
	{
		num2[j] = s2[i] - '0';
		j++;
	}
	
	for(i=0;i<M;i++){
		ans[i]=num1[i];
	} 
	
	for(i=0; i<=M; i++)               //实现大数的加法 
	{
		ans[i] = ans[i]+num2[i];
		if(ans[i]>9)
		{
			ans[i] = ans[i]%10;
			ans[i+1]++; 	
		}	
	}
	
	for(i=M-1; i>=0&&ans[i]==0; i--);  //求得最终结果的位数 
	
	if(i>=0)
	{
		for(j=0; i>=0; j++,i--)                    //最终答案的输出 
		{
			result[j] = ans[i]+'0';	
		}
	}
	else 
		printf("0");
	result[j]=0;
	return 0;
}

int subnum(const char s1[], const char s2[], char result[], int *result_symbol){    //单纯的不带符号的数据的减法(减出的结果会带符号)
	int i,j,k,n,len_s1,len_s2;	//n表示两个数字的大小 ,k表示参与运算数据最大位数 
	int num1[M] = {0};           // 数字数组num1 (不带符号) 
	int num2[M] = {0};           // 数字数组num2 (不带符号)
	int ans[M] = {0};			//数字数组(不带符号)存放结果 
		
	len_s1 = strlen(s1);         //	求第一个数的位数 (带符号) 
	len_s2 = strlen(s2);
	
	for(i=len_s1-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第一个数 
	{
		num1[j] = s1[i] - '0';
		j++;
	}
	for(i=len_s2-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第二个数 
	{
		num2[j] = s2[i] - '0';
		j++;
	}
	
	k=len_s1>len_s2?len_s1:len_s2; 
	
	//n>0表示a>b, n<0表示a<b, n=0表示a=b 
	if(len_s1 > len_s2)
		n = 1;
	else if(len_s1 == len_s2)
		n = strcmp(s1, s2);
	else 
		n = -1;

	//具体执行减法运算 
	for(i=0; i<k; i++)
	{
		if(n>=0)
		{
			if(num1[i]-num2[i] >= 0)
				ans[i] = num1[i] - num2[i];
			else 
			{
				ans[i] = num1[i] + 10 - num2[i];
				num1[i+1]--;
			}
		}
		else 
		{
			if(num2[i]-num1[i] >= 0)
				ans[i] = num2[i] - num1[i];
			else
			{
				ans[i] = num2[i] + 10 - num1[i];
				num2[i+1]--;
			}
		}
	}
	
	//最终结果的输出 
	if(n<0)
		*result_symbol = 1;
	i=k-1;
	while(i>=0){
		if(ans[i]!=0){	//去除高位0 
			for(; i>=0; i--)
			{
				result[k-i-1]=ans[i]+'0';
				printf("%d", ans[i]);
			}	
		}
	}
	
	result[k]=0;
	printf("\n");
	return 0;
}

int add(pBigint s1 ,pBigint s2 , pBigint result){	 	
	//先求符号位
	if(s1->symbol==0){
		if(s2->symbol==0){	//都为正数
			result->symbol=0;
			return addnum(s1->num,s2->num,result->num);
		}
		else {//s1为正数s2为负数,则s1-s2 
			return subnum(s1->num,s2->num,result->num,&result->symbol);
		}	
	}
	else{
		if(s2->symbol==0){	//s1为负数s2为正数
			return subnum(s2->num,s1->num,result->num,&result->symbol);	//s1为负数,则s2-s1
		}
		else {				//都为负数 
			result->symbol=1;
			return addnum(s1->num,s2->num,result->num);	
		}
	}
	
	return 0;
} 

int sub(const pBigint s1 , const pBigint s2 , pBigint result){
	//先解决符号位
	if(s1->symbol==0){
		if(s2->symbol==0)	//都为正数
			return subnum(s1->num,s2->num,result->num,&result->symbol);
		else {
			result->symbol=0;	//s1为正数s2为负数,则s1+s2 
			return addnum(s1->num,s2->num,result->num);
		}	
	}
	else{
		if(s2->symbol==0){	//s1为负数s2为正数
			result->symbol=1;
			return addnum(s1->num,s2->num,result->num);	//s1为负数s2为正数,则s2+s1
		}
		else {				//都为负数 
			return subnum(s2->num,s1->num,result->num,&result->symbol);	//s1s2都为负数,则s2-s1
		}
	}
	
	return 0;
}

int main()
{	
	Bigint snum1 , snum2 , result; 
	char s1[M+1],s2[M+1] ;
	scanf("%s %s", s1, s2); 
	//数据处理 将符号位与数据位分离
	if(s1[0]=='-')
		snum1.symbol = 1;
	else
		snum1.symbol = 0;
	if(s2[0]=='-')
		snum2.symbol = 1;
	else
		snum2.symbol = 0;
	strcpy(snum1.num, s1+1);  
	strcpy(snum2.num, s2+1);  
	printf("num1=%s,num2=%s\n",snum1.num, snum2.num); 
	
	add(&snum1 , &snum2 , &result);
	if(result.symbol==0)
		printf("\nadd result= %s\n",result.num);
	else
		printf("\nadd result= -%s\n",result.num);
	sub(&snum1 , &snum2,  &result);
	if(result.symbol==0)
		printf("\nsub result= %s\n",result.num);
	else
		printf("\nsub result= -%s\n",result.num);
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值