最近在整理總結舊知識,自己寫的一個大數字符串加法算法,供大家參考:
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;
}
結果如下:
我沒有做更加嚴謹的測試,如果發現有問題的話可以給我留言,一起討論。