鱼C论坛

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

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

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

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

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

x
  1. /*
  2. 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

  3. 注意:

  4.     num1 和num2 的长度都小于 5100.
  5.     num1 和num2 都只包含数字 0-9.
  6.     num1 和num2 都不包含任何前导零。
  7.     你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

  8. */
复制代码


  1. char * addStrings(char * num1, char * num2)
  2. {
  3.    
  4.     int     len_num1    = strlen(num1);
  5.     int     len_num2    = strlen(num2);
  6.     int     max_len     = len_num1 > len_num2 ? len_num1 : len_num2;
  7.     int     min_len     = len_num1 > len_num2 ? len_num2 : len_num1;
  8.     char*   longerstr   = len_num1 > len_num2 ? num1     : num2;
  9.     char*   shorterstr  = len_num1 > len_num2 ? num2     : num1;
  10.    
  11.     int     carry_flag  = 0;    /* 0 无进位,1有进位*/
  12.     char*   pointer2    = NULL;
  13.     int     i           = 0;
  14.     int     temp        = 0;
  15.    
  16.    
  17.     carry_flag = 0;
  18.     for(i = max_len-1 ; i >= 0; i--)
  19.     {
  20.         if(max_len - i  <= min_len)
  21.         {
  22.             temp = longerstr[i] - 0x30 + shorterstr[i+min_len-max_len] - 0x30 + carry_flag;
  23.         }
  24.         else
  25.         {
  26.             temp = longerstr[i] - 0x30 + carry_flag;
  27.         }
  28.         longerstr[i] = temp % 10 + 0x30;
  29.         if(temp>=10)
  30.         {
  31.             carry_flag = 1;
  32.         }
  33.         else
  34.         {
  35.             carry_flag = 0;
  36.         }
  37.     }
  38.    
  39.     if(carry_flag == 0)
  40.     {
  41.         return longerstr;
  42.     }
  43.     else
  44.     {
  45.         pointer2 = (char*)malloc(sizeof(char)*(max_len+2));
  46.         pointer2[max_len+1] = 0;
  47.         
  48.         pointer2[0] = '1';
  49.         memcpy(&pointer2[1],longerstr,max_len);
  50.         
  51.         
  52.         return pointer2;
  53.     }
  54. }
复制代码


  1. int main()
  2. {
  3.     char a[] = "1";
  4.     char b[] = "1";
  5.     char* c = addStrings(a, b);
  6.     printf("c = %s \n",c);
  7. }


  8. /*
  9. 执行用时 : 4 ms, 在Add Strings的C提交中击败了100.00% 的用户
  10. 内存消耗 : 7.2 MB, 在Add Strings的C提交中击败了85.94% 的用户


  11. 315 / 315 个通过测试用例
  12. 状态:通过
  13. 执行用时:4 ms
  14. 提交时间:2 分钟之前
  15. */
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
统一出口后:
  1. char * addStrings(char * num1, char * num2)
  2. {
  3.    
  4.     int     len_num1    = strlen(num1);
  5.     int     len_num2    = strlen(num2);
  6.     int     max_len     = len_num1 > len_num2 ? len_num1 : len_num2;
  7.     int     min_len     = len_num1 > len_num2 ? len_num2 : len_num1;
  8.     char*   longerstr   = len_num1 > len_num2 ? num1     : num2;
  9.     char*   shorterstr  = len_num1 > len_num2 ? num2     : num1;
  10.    
  11.     int     carry_flag  = 0;    /* 0 无进位,1有进位*/
  12.     char*   pointer1    = NULL;
  13.     char*   pointer2    = NULL;
  14.     int     i           = 0;
  15.     int     temp        = 0;


  16.    pointer1 = (char*)malloc(sizeof(char)*(max_len+1));
  17.    pointer1[max_len] = 0;
  18.    
  19.    
  20.    
  21.     carry_flag = 0;
  22.     for(i = max_len-1 ; i >= 0; i--)
  23.     {
  24.         if(max_len - i  <= min_len)
  25.         {
  26.             temp = longerstr[i] - 0x30 + shorterstr[i+min_len-max_len] - 0x30 + carry_flag;
  27.         }
  28.         else
  29.         {
  30.             temp = longerstr[i] - 0x30 + carry_flag;
  31.         }
  32.         pointer1[i] = temp % 10 + 0x30;
  33.         if(temp>=10)
  34.         {
  35.             carry_flag = 1;
  36.         }
  37.         else
  38.         {
  39.             carry_flag = 0;
  40.         }
  41.     }
  42.    
  43.     if(carry_flag == 0)
  44.     {
  45.         return pointer1;
  46.     }
  47.     else
  48.     {
  49.         pointer2 = (char*)malloc(sizeof(char)*(max_len+2));
  50.         pointer2[max_len+1] = 0;
  51.         
  52.         pointer2[0] = '1';
  53.         memcpy(&pointer2[1],pointer1,max_len);
  54.         free(pointer1);
  55.         pointer1 = NULL;
  56.         return pointer2;
  57.     }
  58. }
  59. 结果还不错: 执行用时 : 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-4-27 15:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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