C – 如果长度不同,则将2个字符串中的数字加在一起

如果我有两个字符串:

a = "1234" b = "4321" 

我可以像这样将两个数字加在一起:

 for(i=0; i 9){ carry = 1; sum-=10; } answer[i] = sum+48; } if(carry) answer[i++] = carry+48; answer[i]= 0; 

然后反转它(宽度等于strlen(a))。

如果以下情况我怎么能做同样的事情呢?

 a = "12345" b = "4321" 

我需要重新分配内存吗? 或者是什么?

(顺便说一下 – 我试图解决的问题是使用50位数的所有数字,所以strtoul或strtoull是不可理解的。据我所知。 这是我的代码到目前为止 。)

 int getcharval(const char *s, int idx) { if (idx < strlen(s)) return s[strlen(s) - idx - 1] - 48; return 0; } void add() { const char *a = "1234"; const char *b = "13210"; char answer[256]; int i, wa=strlen(a), wb=strlen(b), width, sum, carry; width = wa > wb ? wa : wb; for(i=0; i 9){ carry = 1; sum-=10; } answer[i] = sum+48; } if(carry) answer[i++] = carry+48; answer[i]= 0; for (i = 0; i < strlen(answer) / 2; i++) { char t = answer[i]; answer[i] = answer[strlen(answer) - i - 1]; answer[strlen(answer) - i - 1] = t; } printf("%s\n", answer); } 

如果你坚持使用“小学新增”,找到两个弦的长度,前进到它们的末端,然后向后移动直到较短的弦的长度用尽。 然后继续只移动较长的字符串,假设较短字符串的剩余数字为零:

 12345 04321 

您需要一直移动到较长字符串的开头,并在那里处理进位。 请注意,无论如何都需要分配一个新结果,因为添加两个N位数字可能会因为进位而导致N+1数字。

 #include  #include  #include  #define c2d(c) (c-'0') #define d2c(c) (c+'0') char* add(const char *a, const char *b, char *ans){ int alen, blen; int i, carry=0; char *wk; char *awk=strdup(a); char *bwk=strdup(b); alen=strlen(strrev(awk)); blen=strlen(strrev(bwk)); if(alen 

引自C – 如果不同的长度答案, 将2个字符串中的数字加在一起 ,我写了一个更易读的代码:

 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); } 

测试代码如下:

 void test_str_str_add(){ char s1[] = "123"; char s2[] = "456"; char s3[10] = {'\0'}; str_add(s1, s2, s3); std::cout< 

输出:

579

456912

100020