题目:输入两个数字字符串 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];
}
}