最近在整理总结旧知识,自己写的一个大数字符串加法算法,供大家参考:
char *StrAddStr(const char *sub1, const char *sub2)
{
if (sub1 == NULL &&
sub2 == NULL)
return "0";
if (sub2 == NULL)
return (char*)sub1;
if (sub1 == NULL)
return (char*)sub2;
int sub1_len = strlen(sub1);
int sub2_len = strlen(sub2);
if (sub1_len > 256 || sub2_len > 256)
return NULL; // 不支持该长度
int sub1_order[256] = {0}, sub2_order[256] = {0};
int result[256] = {0};
static char strres[256];
memset(strres, 0, 256);
int j = 0;
// 变成数字并反序
for (int i=sub1_len-1; i>=0; i--)
sub1_order[j++] = *(sub1 + i) - '0';
j = 0;
for (int i=sub2_len-1; i>=0; i--)
sub2_order[j++] = *(sub2 + i) - '0';
int len = 0; // 记录计算结果长度
for (int i=0; i<(sub1_len>sub2_len?sub1_len:sub2_len); i++)
{
int res = result[i] + sub1_order[i] + sub2_order[i];
if (res >= 10)
{
result[i] = res - 10;
result[i+1] += 1; // 进位
len = i+1;
}
else
{
result[i] = res;
len = i;
}
}
// 正序,变成字符串
j=0;
for (int i= len; i>=0; i--)
{
strres[j++] = result[i] + '0';
}
return strres;
}
简单的测试代码:
int main ()
{
char *strnum1 = "12345";
char *strnum2 = "234";
char *res = StrAddStr(strnum1, strnum2);
printf("12345+234=%s\r\n", res);
strnum1 = "9876";
strnum2 = "132089";
res = StrAddStr(strnum1, strnum2);
printf("9876+132089=%s\r\n", res);
strnum1 = "876123089982";
strnum2 = "673526156533";
res = StrAddStr(strnum1, strnum2);
printf("876123089982+673526156533=%s\r\n", res);
return 0;
}
结果如下:
我没有做更加严谨的测试,如果发现有问题的话可以给我留言,一起讨论。