刷题 (牛客网)NC1 大数加法

题目:输入两个数字字符串 s 和 t,输出两个数字和的字符串

输入:s 和 t 的长度为:[0, 100000],字符均为 '0' ~ '9'

输出:s 和 t 的和的字符串

限制:时间复杂度 O(n)

解题语言:C语言

解题思路

        题目本质就是模拟加法的计算过程。已知 s 和 t 的最大长度是100000,则它们俩的和长度最多100001,则可定义一个长度为100002的字符数组 result 来存储最后的结果,由低到高依次计算 s 和 t 从个位开始的数字的和,取出基数 和 进位,基数依次从result数组的末尾向前填入,进位则保留参与更高位的基数的计算。

解题后的心得:

        思考,利用函数结束返回的机制,从字符串中间某个索引处返回,来获取子串或者截取字符串的方法,是否适用于在实际工作中处理字符串。

头文件引用 和 宏定义:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NUM_STR_LEN     (100001)

main函数实现:

int main(int argc, char *argv[])
{
    char *pResultStr = NULL;
    
    char numStr1[MAX_NUM_STR_LEN];
    char numStr2[MAX_NUM_STR_LEN];

    scanf("%s %s", numStr1, numStr2);

    pResultStr = solve(numStr1, numStr2);
    if (NULL != pResultStr)
    {
        printf("%s + %s = %s\n", numStr1, numStr2, pResultStr);
    }
    else
    {
        printf("%s + %s = NULL\n", numStr1, numStr2);
    }

    return 0;
}

求和函数实现:

char* solve(char* s, char* t) 
{
    char *pSumStr   = NULL;
    int   sumStrLen = 0;

    int s_len = 0;
    int t_len = 0;

    int tmpNum   = 0;
    int baseNum  = 0;
    int carryBit = 0;

    int i   = 0;
    int s_i = 0;
    int t_i = 0;

    if (NULL == s ||
        0 >= strlen(s))
    {
        return t;
    }

    if (NULL == t ||
        0 >= strlen(t))
    {
        return s;
    }

    s_i = strlen(s);
    t_i = strlen(t);

    //printf("s: %s( %d ), t: %s( %d )\n\n", s, s_i, t, t_i);

    pSumStr = (char*)malloc((MAX_NUM_STR_LEN+1)*sizeof(char));
    memset(pSumStr, 0, ((MAX_NUM_STR_LEN+1)*sizeof(char)));
    pSumStr[MAX_NUM_STR_LEN] = '\0';

    for (i = MAX_NUM_STR_LEN; i > 0; i--)
    {
        if (0 < s_i && 0 < t_i)
        {
            tmpNum = (s[s_i-1] - '0') + (t[t_i-1] - '0');
            s_i--;
            t_i--;
        }
        else if (0 < s_i)
        {
            tmpNum = (s[s_i-1] - '0') + 0;
            s_i--;
        }
        else if (0 < t_i)
        {
            tmpNum = 0 + (t[t_i-1] - '0');
            t_i--;
        }
        else
        {   
            tmpNum = 0;   
        }

        //printf("i: %d, s[%d]: %c, t[%d]: %c, tmpNum: %d, carryBit: %d\n", i, s_i, s[s_i], t_i, t[t_i], tmpNum, carryBit);

        baseNum  = (tmpNum+carryBit)%10;
        carryBit = (tmpNum+carryBit)/10;

        pSumStr[i-1] = '0'+ baseNum;

        //printf("baseNum: %d, carryBit: %d, pSumStr[%d]: %c\n\n", baseNum, carryBit, i-1, pSumStr[i-1]);
    }

    //printf("pSumStr: %s\n", pSumStr);

    for (i = 0; i < MAX_NUM_STR_LEN; i++)
    {
        if ('0' != pSumStr[i])
        {
            break;
        }
    }
    
    if (i >= MAX_NUM_STR_LEN)
    {
        return &pSumStr[MAX_NUM_STR_LEN-1];
    }
    else
    {
        return &pSumStr[i];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值