carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode415:字符串相加(add-strings) #96

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1: 输入:num1 = "11", num2 = "123" 输出:"134"

示例 2: 输入:num1 = "456", num2 = "77" 输出:"533"

示例 3: 输入:num1 = "0", num2 = "0" 输出:"0"

提示: 1 <= num1.length, num2.length <= 104 num1 和num2 都只包含数字 0-9 num1 和num2 都不包含任何前导零

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/add-strings

carloscn commented 1 year ago

问题分析

相加即可,注意处理进位

static int32_t str_add(char *str1, char *str2, char *str_out)
{
    int32_t ret = 0;
    size_t str1_len, str2_len, out_len;
    size_t min_len = 0, max_len = 0;
    size_t i = 0;
    size_t carry = 0;
    size_t val = 0;
    char *max_str = NULL, *min_str = NULL;

    UTILS_CHECK_PTR(str1);
    UTILS_CHECK_PTR(str2);
    UTILS_CHECK_PTR(str_out);

    UTILS_CHECK_LEN(str1_len = strlen(str1));
    UTILS_CHECK_LEN(str2_len = strlen(str2));

    if (str1_len > str2_len) {
        max_len = str1_len;
        min_len = str2_len;
        max_str = str1;
        min_str = str2;
    } else {
        max_len = str2_len;
        min_len = str1_len;
        max_str = str2;
        min_str = str1;
    }

    memset(str_out, 0, max_len + 1);

    for (i = 0; i < max_len; i ++) {
        val = (i >= min_len) ? (CHAR_TO_INT(max_str[max_len - i - 1]) + carry) :
                               (CHAR_TO_INT(max_str[max_len - i - 1]) + \
                                CHAR_TO_INT(min_str[min_len - i - 1]) + carry);
        carry = val / 10, val %= 10;
        str_out[i] = INT_TO_CHAR(val);
    }
    str_out[i] = (carry == 0) ? 0 : INT_TO_CHAR(carry);

    out_len = strlen(str_out);
    for (i = 0; i < out_len / 2; i ++) {
        utils_swap_char(str_out + i, str_out + out_len - i - 1);
    }

finish:
    return ret;
}
carloscn commented 1 year ago

code:

https://github.com/carloscn/structstudy/blob/master/c_programming/str/27_add-strings_415.c

result:

image