鱼C论坛

 找回密码
 立即注册
查看: 2247|回复: 2

[技术交流] 415_字符串相加

[复制链接]
发表于 2019-5-24 13:50:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*
给定两个字符串形式的非负整数 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[i] - 0x30 + shorterstr[i+min_len-max_len] - 0x30 + carry_flag;
        }
        else
        {
            temp = longerstr[i] - 0x30 + carry_flag;
        }
        longerstr[i] = 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[max_len+1] = 0;
        
        pointer2[0] = '1';
        memcpy(&pointer2[1],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 分钟之前
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-24 13:52:32 | 显示全部楼层
解法与https://fishc.com.cn/thread-140331-1-1.html 一致。。

缺点:
返回值接口指针没统一,有两种可能,一种需要free,一种不需要free但会导致原数组被改变.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-24 14:11:21 | 显示全部楼层
统一出口后:
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[max_len] = 0;
   
    
    
    carry_flag = 0;
    for(i = max_len-1 ; i >= 0; i--)
    {
        if(max_len - i  <= min_len)
        {
            temp = longerstr[i] - 0x30 + shorterstr[i+min_len-max_len] - 0x30 + carry_flag;
        }
        else
        {
            temp = longerstr[i] - 0x30 + carry_flag;
        }
        pointer1[i] = 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[max_len+1] = 0;
        
        pointer2[0] = '1';
        memcpy(&pointer2[1],pointer1,max_len);
        free(pointer1);
        pointer1 = NULL;
        return pointer2;
    }
}
结果还不错: 执行用时 : 8 ms, 在Add Strings的C提交中击败了98.41% 的用户 内存消耗 : 7.2 MB, 在Add Strings的C提交中击败了87.50% 的用户
结果也不错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表