cited from C - Adding the numbers in 2 strings together if a different length answer, I write a more readable code:
void str_reverse(char *beg, char *end){ if(!beg || !end)return; char cTmp; while(beg < end){ cTmp = *beg; *beg++ = *end; *end-- = cTmp; } } #define c2d(c) (c - '0') #define d2c(d) (d + '0') void str_add(const char* s1, const char* s2, char* s_ret){ int s1_len = strlen(s1); int s2_len = strlen(s2); int max_len = s1_len; int min_len = s2_len; const char *ps_max = s1; const char *ps_min = s2; if(s2_len > s1_len){ ps_min = s1;min_len = s1_len; ps_max = s2;max_len = s2_len; } int carry = 0; int i, j = 0; for (i = max_len - 1; i >= 0; --i) { // this wrong-prone int idx = (i - max_len + min_len) >=0 ? (i - max_len + min_len) : -1; int sum = c2d(ps_max[i]) + (idx >=0 ? c2d(ps_min[idx]) : 0) + carry; carry = sum / 10; sum = sum % 10; s_ret[j++] = d2c(sum); } if(carry)s_ret[j] = '1'; str_reverse(s_ret, s_ret + strlen(s_ret) - 1); }
test code as below:
void test_str_str_add(){ char s1[] = "123"; char s2[] = "456"; char s3[10] = {'\0'}; str_add(s1, s2, s3); std::cout<<s3<<std::endl; char s4[] = "456789"; char s5[10] = {'\0'}; str_add(s1, s4, s5); std::cout<<s5<<std::endl; char s7[] = "99999"; char s8[] = "21"; char s9[10] = {'\0'}; str_add(s7, s8, s9); std::cout<<s9<<std::endl; }
output:
579
456912
100020