C - Adding the numbers in 2 strings together if a different length

前端 未结 5 1899
粉色の甜心
粉色の甜心 2020-12-22 09:10

If I had two strings:

a = \"1234\"
b = \"4321\"

I could add the two numbers together like this:

for(i=0; i

        
5条回答
  •  盖世英雄少女心
    2020-12-22 09:22

    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<

    output:

    579

    456912

    100020

提交回复
热议问题