两个大数据相加

在华为面试见到这道题,觉得有点意思,按照自己的思路实现了两个大数据相加的算法,仅供参考


#include <stdio.h>
#include <string.h>


void swap(char* result)
{
	int sz = strlen(result);

	for (int i = 0; i < sz / 2; i++)
	{
		char c = result[i];
		result[i] = result[sz - 1 - i];
		result[sz - 1 - i] = c;
	}
}

void adding(const char* num1, const char* num2, char* result, int maxsize)
{
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	int data = 0;
	int carry  = 0;
	int i = len1 - 1;
	int j = len2 - 1;
	int n = 0;

	memset(result, 0, maxsize);

	while((i >= 0 || j >= 0) && n < maxsize - 1)
	{
		int d1 = 0;
		int d2 = 0;

		if (i >= 0)
		{
			d1 = (num1[i] - '0');
		}

		if (j >= 0)
		{
			d2 = (num2[j] - '0');
		}

		if (carry)
		{
			data = d1 + d2 + 1;
		}
		else
		{
			data = d1 + d2;
		}

		if (data >= 10)
		{
			carry = 1;
			result[n] = '0' + (data - 10);
		}
		else
		{
			carry = 0;
			result[n] = '0' + data;
		}

		if (i >= 0) i--;
		if (j >= 0) j--;
		n++;
	}

	swap(result);
}

//num1 >= num2
void subtract(const char* num1, const char* num2, char* result, int maxsize)
{
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	int borrow = 0;
	int data = 0;
	int i = len1 - 1;
	int j = len2 - 1;
	int n = 0;

	memset(result, 0, maxsize);

	while((i >= 0 || j >= 0) && n < maxsize - 1)
	{
		int d1 = 0;
		int d2 = 0;

		if (i >= 0)
		{
			d1 =  num1[i] - '0';
		}

		if (j >= 0)
		{
			d2 = num2[j] - '0';
		}

		if (d1 - borrow >= d2)
		{
			data = (d1 - borrow) - d2;
			borrow = 0;
		}
		else
		{
			data = 10 + (d1 - borrow) - d2;
			borrow = 1;
		}

		result[n] = '0' + data;

		if (i >= 0) i--;
		if (j >= 0) j--;
		n++;
	}

	swap(result);
}

void setSign(char* num, char sign)
{
	memmove(num + 1, num, strlen(num));
	num[0] = sign;
}

void addBigNumber(const char* num1, const char* num2, char* result, int maxsize)
{
	int sign1 = 0;
	int sign2 = 0;

	char* p1 = (char*)num1;
	char* p2 = (char*)num2;

	if (*p1 == '-')
	{
		sign1 = 1;
		p1++;
	}

	if (*p2 == '-')
	{
		sign2 = 1;
		p2++;
	}

	if (*p1 == '+')
	{
		sign1 = 0;
		p1++;
	}

	if (*p2 == '+')
	{
		sign2 = 0;
		p2++;
	}

	if (sign1 == sign2)
	{
		adding(p1, p2, result, maxsize);

		if (sign1)
		{
			setSign(result, '-');
		}
	}
	else
	{
		int len1 = strlen(p1);
		int len2 = strlen(p2);
		
		char* max = NULL;
		char* min = NULL;

		if (len1 > len2)
		{
			max = p1;
			min = p2;
		}
		else
		{
			max = p2;
			min = p1;
		}

		subtract(max, min, result, maxsize);

		if ((sign1 && len1 >= len2) || (sign2 &&  len2 >= len1))
		{
			setSign(result, '-');
		}
	}
}


int main(int argc, char* argv[])
{
    char* num1 = "41005790423423534532349045988515337";
    char* num2 = "-1002352343249443254647564359348342";

    char result[128] = {0};
    addBigNumber(num1, num2, result, sizeof(result));
    printf("(%s) + (%s) = %s\n", num1, num2, result);
}


计算结果:



猜你喜欢

转载自blog.csdn.net/vison0300/article/details/21019103