`
xumingrencai
  • 浏览: 1179725 次
文章分类
社区版块
存档分类
最新评论

大数据 加法

 
阅读更多
#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;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics