415_字符串相加
/*给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
*/
char * addStrings(char * num1, char * num2)
{
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
int max_len = len_num1 > len_num2 ? len_num1 : len_num2;
int min_len = len_num1 > len_num2 ? len_num2 : len_num1;
char* longerstr = len_num1 > len_num2 ? num1 : num2;
char* shorterstr= len_num1 > len_num2 ? num2 : num1;
int carry_flag= 0; /* 0 无进位,1有进位*/
char* pointer2 = NULL;
int i = 0;
int temp = 0;
carry_flag = 0;
for(i = max_len-1 ; i >= 0; i--)
{
if(max_len - i<= min_len)
{
temp = longerstr - 0x30 + shorterstr - 0x30 + carry_flag;
}
else
{
temp = longerstr - 0x30 + carry_flag;
}
longerstr = temp % 10 + 0x30;
if(temp>=10)
{
carry_flag = 1;
}
else
{
carry_flag = 0;
}
}
if(carry_flag == 0)
{
return longerstr;
}
else
{
pointer2 = (char*)malloc(sizeof(char)*(max_len+2));
pointer2 = 0;
pointer2 = '1';
memcpy(&pointer2,longerstr,max_len);
return pointer2;
}
}
int main()
{
char a[] = "1";
char b[] = "1";
char* c = addStrings(a, b);
printf("c = %s \n",c);
}
/*
执行用时 : 4 ms, 在Add Strings的C提交中击败了100.00% 的用户
内存消耗 : 7.2 MB, 在Add Strings的C提交中击败了85.94% 的用户
315 / 315 个通过测试用例
状态:通过
执行用时:4 ms
提交时间:2 分钟之前
*/ 解法与https://fishc.com.cn/thread-140331-1-1.html 一致。。
缺点:
返回值接口指针没统一,有两种可能,一种需要free,一种不需要free但会导致原数组被改变. 统一出口后:
char * addStrings(char * num1, char * num2)
{
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
int max_len = len_num1 > len_num2 ? len_num1 : len_num2;
int min_len = len_num1 > len_num2 ? len_num2 : len_num1;
char* longerstr = len_num1 > len_num2 ? num1 : num2;
char* shorterstr= len_num1 > len_num2 ? num2 : num1;
int carry_flag= 0; /* 0 无进位,1有进位*/
char* pointer1 = NULL;
char* pointer2 = NULL;
int i = 0;
int temp = 0;
pointer1 = (char*)malloc(sizeof(char)*(max_len+1));
pointer1 = 0;
carry_flag = 0;
for(i = max_len-1 ; i >= 0; i--)
{
if(max_len - i<= min_len)
{
temp = longerstr - 0x30 + shorterstr - 0x30 + carry_flag;
}
else
{
temp = longerstr - 0x30 + carry_flag;
}
pointer1 = temp % 10 + 0x30;
if(temp>=10)
{
carry_flag = 1;
}
else
{
carry_flag = 0;
}
}
if(carry_flag == 0)
{
return pointer1;
}
else
{
pointer2 = (char*)malloc(sizeof(char)*(max_len+2));
pointer2 = 0;
pointer2 = '1';
memcpy(&pointer2,pointer1,max_len);
free(pointer1);
pointer1 = NULL;
return pointer2;
}
}
结果还不错: 执行用时 : 8 ms, 在Add Strings的C提交中击败了98.41% 的用户 内存消耗 : 7.2 MB, 在Add Strings的C提交中击败了87.50% 的用户
结果也不错。
页:
[1]