实现两个超大整数相加 -- C语言

思路

从后向前处理,逐个相加,记录进位Carrer;注意到头的结束条件是 str -1, 因为字符串的头本身也要处理,结束条件是头前面的一个指针地址;最后如果有更长的一个数字,将其剩下的部分加Carrer,补充到前面。最前面一个处理,C可能为1,我们一般多留一位,如果C为0,那么整个字符串前移一位,结尾提前一位写入'\0'

代码实现

int addBigInt(char * str1, char * str2, char * rst){
	if(NULL == str1 || NULL == str2 || NULL == rst){
		printf("addBigInt param error\n");
		return PARAM_ERR;
	}

	char * p1 = NULL, *p2 = NULL, * pr = NULL;
	char * tail1 = NULL, *tail2 = NULL, *tailr = NULL;
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	int len = len1 > len2 ? len1 : len2;
	int a = 0, b = 0, r= 0, c = 0;
	
	len = len + 1; /*最后可能发生进位*/
	tail1 = str1 + len1 - 1;
	tail2 = str2 + len2 - 1;
	pr = rst;
	tailr = pr + (len - 1);
	*(pr + len) = '\0'; /*结尾*/
	

	/*
	 * 注意这里要用str-1, 因为字符串的头本身也要处理,
	 * 结束条件是头前面的一个指针地址
	 */
	while(tail1 != str1 - 1 &&  tail2 != str2 - 1){ 
		a = *tail1 - '0';	
		b = *tail2 - '0';
		r = a + b + c;
		if(r >= 10){
			r = r % 10;
			c = 1;
		} else {
			c = 0;
		}
		*tailr = '0' + r;		

		tail1--;
		tail2--;
		tailr--;
	}

	while(tail1 != str1 - 1){
		a = *tail1 - '0';
		r = a + c;
		if(r >= 10){
			r = r % 10;
			c = 1;
		} else {
			c = 0;
		}
		*tailr = '0' + r;

		tail1--;
		tailr--;
	}

	while(tail2 != str2 - 1){
		b = *tail2 - '0';
		r = b + c;
		if(r >= 10){
			r = r % 10;
			c = 1;
		} else {
			c = 0;
		}
		*tailr = '0' + r;

		tail2--;
		tailr--;
	}

	if(0 == c){
		memcpy(tailr, tailr + 1, len - 1);
		*(rst + len - 1) = '\0'; /*因为字符串迁移了,所以要提前一位写入'\0'标明结束*/
	} else if (1 == c){
		*tailr = '0' + c;
	}

	return SUCCESS;	
	
}

void testaddBigInt(void){
	char str1[100] = "123456789323";
	char str2[100] = "45671254563123";
	char str3[100] = "523456789323";
	char str4[100] = "99671254563123";	
	char rst[100] = {'\0'};

	printf("\n************  testaddBigInt ************ \n");
	
	addBigInt(str1, str2, rst);

	printf("%s + %s = %s\n", str1, str2, rst);

	memset(rst, 0x0, 100);

	addBigInt(str3, str4, rst);

	printf("%s + %s = %s\n", str3, str4, rst);


	return;
}

代码编译

gcc main.c str.c -g -o a.exe

调试输出

************  testaddBigInt ************
123456789323 + 45671254563123 = 45794711352446
523456789323 + 99671254563123 = 100194711352446

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值