以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:.length,t.length≤100000,字符串仅由'0'~‘9’构成
要求:时间复杂度 O(n)
char* solve(char* s, char* t )
{
//数字位数
int sLen = strlen(s);
int tLen = strlen(t);
int resultLen;
if(sLen == 0) //位数为零则直接返回
return t;
if(tLen == 0)
return s;
//运算结果的位数
if(sLen > tLen) //2个数字相加,和的位数最多为较长数字位数+1,因为是字符串,预留一个'\0'的位置,所有+2
resultLen = sLen+2;
else
resultLen = tLen+2;
//char *result = (char *)malloc(sizeof(char)*resultLen); 申请空间
char *result = (char *)calloc(resultLen, sizeof(char));
int sPos = sLen-1;//求和从最后一位开始(个位)
int tPos = tLen-1;
int resPos = 0;//记录和的字符串当前位置
int carry = 0;//进位
int sum = 0;//求和
int i, j;//翻转字符串
while(sPos >= 0 || tPos >=0 || carry >0) //...或进位大于1时
{
//从后往前,取每位的数字,若较长数字位有效,但较短数字位无效,则较短数字位返回0
int n1 = ( sPos >= 0 ? s[sPos--]-'0' : 0 ); //每位上 有数写数,无数写0
int n2 = ( tPos >= 0 ? t[tPos--]-'0' : 0 );
sum = n1 + n2 + carry;// 求和加上进位运算
if(sum >= 10) //每位求和结果 有进位时
{
carry = 1; //进位置1
result[resPos++] = sum%10+'0'; //该位数字
}
else//无进位时
{
carry = 0; //进位置0
result[resPos++] = sum+'0';
}
}
//s=1,t=99时,result=001,需原地翻转字符串为100
for(i = 0, j = resPos-1; i < j; i++, j--)
{
char tmp = result[i];
result[i] = result[j];
result[j] = tmp;
}
return result;
}