大数据 加法

#include <stdio.h>
#include <string.h>
#include "stdafx.h"
#include <assert.h>

#define MAX(i, j) (((i) > (j)) ? (i) : (j))

void swap(char *pc1, char *pc2)
{
	*pc1 = *pc1 ^ *pc2;
	*pc2 = *pc1 ^ *pc2;
	*pc1 = *pc1 ^ *pc2;
}

void reverse(char *pcStr, int iLen)
{
	assert(NULL != pcStr);
	//printf("%s\n", pcStr);

	int iIdx;

	for (iIdx = 0; iIdx < iLen ; iIdx++)
	{
		swap(&pcStr[iIdx], &pcStr[iLen]);
		iLen--;
	}

	//printf("%s\n", pcStr);

}

char* calculate(char *pcNum1, char *pcNum2)
{
	assert(NULL != pcNum1);
	assert(NULL != pcNum2);

	int iLen1 = 0;
	int iLen2 = 0;
	

	iLen1 = strlen(pcNum1);
	iLen2 = strlen(pcNum2);

	int iLenMax = MAX(iLen1, iLen2);


	reverse(pcNum1, iLen1 - 1);
	reverse(pcNum2, iLen2 - 1);

	//char acResult[iLenMax+ 1] = {0}; /* 存放结果 */
	char *acResult = (char *)malloc(sizeof(char) * (iLenMax+1));
	assert(NULL != acResult);

	memset(acResult, '0', sizeof(char) * (iLenMax+1)); /* 注意初始化 */
	acResult[iLenMax+1] = '\0';/* 注意最后一个位置为\0 */

	int i;

	/* 注意公共部分和非公共部分的相加 */
	for (i = 0; i < iLenMax; i++)
	{
		if ((i < iLen1) && (i < iLen2)) /* 公共部分 */
		{
			acResult[i] = (pcNum1[i] - '0') + (pcNum2[i] - '0');
		}
		else if (i < iLen1)
		{
			acResult[i] = (pcNum1[i] - '0');
		}
		else
		{
			acResult[i] = (pcNum2[i] - '0');
		}
	}

	
	/* 调整结果值 */
	for (i = 0; i < MAX(iLen1, iLen2); i++) /* 注意边界值 */
	{
		acResult[i + 1] += acResult[i] / 10;
		acResult[i] = (acResult[i] % 10) + '0';
	}
	
	reverse(acResult, strlen(acResult) - 1);
	
	return (acResult[0] == '0') ? acResult + 1 : acResult; /* 注意返回值 */
}
int main()
{
	char pcNum1[] = "123456";
	char pcNum2[] = "45645";
	char *p;
	//reverse(pcNum1, strlen(pcNum1) - 1);
	p = calculate(pcNum1, pcNum2);

	printf("%s\n", p);
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值