题解 | #大数加法#

大数加法

https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
 */
char *solve(char *s, char *t)
{
    int lens = strlen(s);
    int lent = strlen(t);

    // 取最大的长度,加一,预留出进位,再加一,预留出结束位字符'\0'
    int lenResult = (lens > lent ? lens : lent) + 1 + 1;
    char *result = (char *)malloc(lenResult);
    memset(result, 0x0, lenResult);

    // 后续从结束位之前开始运算
    int curPtr = lenResult - 1;

    // 临时的运算结果保存
    int temp = 0;
    // 进位标志
    int flag = 0;
    // 只要有一个值没加完,就得一直加
    // 里面所有字符串的操作为先减后用,因为C语言都是从0开始运算,所以使用都是先减再用
    while (0 != lens || 0 != lent)
    {
        // 先加上一次的进位进行
        temp = flag;
        if (0 != lens)
        {
            temp += s[--lens] - '0';
        }
        if (0 != lent)
        {
            temp += t[--lent] - '0';
        }
        flag = temp / 10;
        temp = temp % 10;
        result[--curPtr] = temp + '0';
    }
    // 补上最前面的进位
    result[0] = flag + '0';

    printf("result : %s\n", result);
    // 如果没有进位,则把最前面进位的预留位跳过
    return flag ? result : result + 1;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务