在华为面试见到这道题,觉得有点意思,按照自己的思路实现了两个大数据相加的算法,仅供参考
#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);
}
计算结果: