每日一题(力扣)字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

对于这道题目来说,我们需要按照我们正常的加法来处理,即竖式加法,如果有进位,则进行处理,所以我们的思路是给num1和num2两个数组分别配个指针指向末尾,并同时定义一个变量add来判断进位。同时我们还需要判断,两个数的位数不同,当位数低的数,我们已经加完了,该怎么处理?我们可以进行补0处理,这样结果是不会变的,我们一直循环到两个数都加完为止。

char* addStrings(char* num1, char* num2) {
    int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
    //定义i,j,add的大小,add来判断是否有进位
    char* ans = (char*)malloc(sizeof(char) * (fmax(i, j) + 3));
    //判断两个数组哪个更大一点,以此为基准开辟单元。因为考虑到最后有进位的操作,为安全起见,再扩充三个单元
    int len = 0;//我们将加的数从0开始存放,最后再逆转一下
    while (i >= 0 || j >= 0 || add != 0) 
    //只要i或者j不为0,我们继续执行下去,add不为0,则说明还有进位的数存在
    {
        int x = i >= 0 ? num1[i] - '0' : 0;
        //当i或者j<0的时候,我们就进行补0操作
        int y = j >= 0 ? num2[j] - '0' : 0;
        int result = x + y + add;//两个数相加的结果,并加上上次运算的add值.
        ans[len++] = '0' + result % 10;
        //从数组下标为0开始存放,以字符形式存放,以取模10存放,万一大于10,也不会出现错误
        add = result / 10;//判断是否有进位
        i--, j--;//逐渐逆序相加
    }
    // 计算完以后的答案需要翻转过来
    for (int i = 0; 2 * i < len; i++) {
        int t = ans[i];
        ans[i] = ans[len - i - 1], ans[len - i - 1] = t;
    }
    ans[len++] = 0;
    return ans;
}

最后结果如下:

每日一题(力扣)字符串相加_第1张图片

你可能感兴趣的:(力扣)