美文网首页
43. Multiply Strings

43. Multiply Strings

作者: larrymusk | 来源:发表于2017-11-25 19:23 被阅读0次
          3 2 1
    x       4 3
    _______
          9 6 3
    1 2 8 4
    _______
    1 3 8 0 3
    

    注意:

    1. m位的数字乘以n位的数字的结果最大为m+n位:
      99999 < 1000100 = 100000,最多为3+2 = 5位数。

    2. 先将字符串逆序便于从最低位开始计算。

    3. 首先要注意num1[i] * num2[j]的结果应该加到ret[i+j]的位置上。

    4. 最容易遗漏的corner case 如999*0 = 0000,此时需要去掉开始的0,但又需要保留最后一个0。
      3, char * ret = calloc(len1+len2+1, sizeof(char));
      for(int k = 0; k < len1+len2; k++)
      ret[k] = '0';

    申请完保存结果的数组后,需要初始化为'0', 对应的ascii 48, 而不是0。

    4,进位只用在内层循环内,外围循环开头需要carry置零
    5,保存每次的返回结果值需要记住是字符形式的数字 需要结果上面加'0'
    ret[i+j] = carry%10+'0';

    6, 当循环检测开头的零并删除的时候,要记住遇见零就返回 (ret[m] == '0') 需要放在for判断条件里面里面 而不应该在for循环内部。

    for(int m = 0; m < len1+len2-1 && (ret[m] == '0'); m++)
            index++;
    
    
    
    void reverse(char *a, int left, int right)
    {
        while(left < right){
            char tmp = a[left];
            a[left] = a[right];
            a[right] = tmp;
            left++;
            right--;
        }
    }
    char* multiply(char* num1, char* num2) {
    
        if(num1 == NULL || num2 == NULL)
            return NULL;
        int len1 = strlen(num1);
        int len2 = strlen(num2);
    
        reverse(num1, 0, len1-1);
        reverse(num2,0, len2-1);
        char * ret = calloc(len1+len2+1, sizeof(char));
        for(int k = 0; k < len1+len2; k++)
            ret[k] = '0';
        int i = 0;
        int j = 0;
        int carry = 0;
        int val ;
        for(i = 0; i < len2; i++){
            carry = 0;
            val = num2[i] - '0';
            for(j = 0; j < len1; j++){
    
                carry += ret[i+j]-'0'+val*(num1[j]-'0');
                ret[i+j] = carry%10+'0';
                carry = carry/10;
            }
           
            if(carry)
                ret[i+len1] = carry+'0'; 
        }
    
    
        reverse(ret, 0, len1+len2-1);
        
        ret[len1+len2] = 0;
        int index = 0;
        for(int m = 0; m < len1+len2-1 && (ret[m] == '0'); m++)
                index++;
    
        ret += index;
        return ret; 
    }

    相关文章

      网友评论

          本文标题:43. Multiply Strings

          本文链接:https://www.haomeiwen.com/subject/zxocbxtx.html