zoukankan      html  css  js  c++  java
  • leecode第四十三题(字符串相乘)

    class Solution {
    public:
        string multiply(string num1, string num2) {
            string zero = "0";//特殊情况
            if (num1[0] == '0' || num2[0] == '0')
                return zero;
    
            int len1 = num1.size();
            int len2 = num2.size();
            char **str = new char*[len2];//建立一个二维的len2*(len1+len2+1)的数组,这里的建立和赋值是教学局了,学习
            for (int i = 0; i < len2; i++)
            {
                str[i] = new char[len1 + len2 + 1];
                memset(str[i], '0', len1 + len2);//初始化赋值
                str[i][len1 + len2] = '';//实际用到的只有len1+len2的长度,但是多出一位赋值‘’
    
            }
    
            for (int i = len2 - 1; i >= 0; i--)//这个双重循环目的是用len2里每个值乘len1整体,并保存在二维数组行中
            {
                for (int j = len1 - 1; j >= 0; j--)//至于实现,就是模拟乘法中的每一位相乘,从后向前
                {
                    int ans = (num1[j] - '0')*(num2[i] - '0');
                    str[i][i + j + 1] += ans % 10;//注意这里索引位置,要考虑非个位数值乘法,后面是要补零的
                    str[i][i + j] += ans / 10;
                    if (str[i][i + j + 1] > '9')
                    {
                        str[i][i + j] += 1;
                        str[i][i + j + 1] = str[i][i + j + 1] - '9' + '0' - 1;//这里之前忘了-1
                    }
                }
            }
    
            for (int i = 0; i < len2 - 1; i++)//这里的双重循环目的是将之前保存的,每个位置的乘法结果相加,还是两两相加,所以返回是最后一行
            {
                for (int j = len1 + len2 - 1; j >= 0; j--)
                {
                    str[i + 1][j] += (str[i][j] - '0');
                    if (str[i + 1][j] > '9')
                    {
                        str[i + 1][j - 1] += 1;
                        str[i + 1][j] = str[i + 1][j] - '9' + '0' - 1;
                    }
                }
            }
    
            int i = 0;
            while (str[len2 - 1][i] == '0')//把最后一层开头的0都去掉
            {
                for (int j = 0; j < len1 + len2; j++)
                    str[len2 - 1][i + j] = str[len2 - 1][i + j + 1];
            }
            return str[len2 - 1];
        }
    };

    分析:

    这题我写了半天,不是思想有问题,主要部分第一时间就写好了,就卡在二维数组建立上了,不知道为啥string不方便,只好改用char,用了char初始化还不让我循环初始化,只好用memset,下面的就是忘了对超出'9'的复位后-1,其他就没啥了,感觉这个题思想很简单,考的是编程能力。

  • 相关阅读:
    快速幂模板
    ACM大一寒假集训week1.2
    ACM大一寒假集训week1.1
    Gym
    Gym
    大学ACM第八周心得
    大学ACM第六周心得(11.29)
    大学ACM第五周心得
    大学ACM第四周心得
    大学ACM第三周心得
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10591909.html
Copyright © 2011-2022 走看看