zoukankan      html  css  js  c++  java
  • 【LeetCode练习题】Multiply Strings

    Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string.

    Note: The numbers can be arbitrarily large and are non-negative.

    题目意思:

    给两个string,计算string的乘积。

    string中的数可以非常大并且是非负数。

    (就是大数的乘法运算嘛。。。)

    解题思路:

    由于之前已经练习过了大数的加减乘除四则运算了,所以这道题跟那个是一样的原理。

    要想实现乘法,首先得实现大数的加法,因为按照小学摆竖式计算乘法的时候需要在会加法的基础上才行。

    于是我们首先实现了大数的加法,基本上就是模拟了用竖式每一位相加的过程,其中注意到产生的进制要参与高位的运算。

    实现了加法后,乘法也就出来了。

    更详细的四则运算完整代码在这里。

    代码如下:

     1 string operator+(const string &num1,const string &num2){
     2     int nCarry = 0;
     3     string numTemp;
     4         
     5     int i = num2.size() - 1;
     6     int j = num1.size() - 1;
     7     for(; i >= 0 || j >= 0; i--,j--){
     8         char a,b;
     9         if(i>=0)
    10             b = num2[i] - '0';
    11         else
    12             b = 0;
    13         if(j>=0)
    14             a = num1[j] - '0';
    15         else
    16             a = 0;
    17         char c = a + b + nCarry;
    18         nCarry = c / 10;
    19         numTemp.push_back(c%10 + '0');
    20     }
    21 
    22     if(nCarry != 0){
    23         numTemp.push_back(nCarry + '0');
    24     }
    25 
    26     for(i = 0, j = numTemp.size() - 1; i < j; i++,j--){
    27         char cTemp = numTemp[i];
    28         numTemp[i] = numTemp[j];
    29         numTemp[j] = cTemp;
    30     }
    31     return numTemp;
    32 }
    33 string operator*(const string &num1,const string &num2){
    34     int nCarry = 0;
    35     string numTemp;
    36     string result;
    37 
    38     int i = num2.size()-1;
    39     for(; i >= 0; i--){
    40         char a = num2[i] - '0';
    41         int j = num1.size() - 1;
    42         for(; j >= 0; j--){
    43             char b = num1[j] - '0';
    44             char c = b * a + nCarry;
    45             nCarry = c/10;
    46             numTemp.push_back(c % 10 + '0');
    47         }
    48         if(nCarry != 0){
    49             numTemp.push_back(nCarry + '0');
    50             nCarry = 0;
    51         }
    52 
    53         //reverse
    54         int n = 0;
    55         int m = numTemp.size() - 1;
    56         for(; n < m; n++,m--){
    57             char cTemp = numTemp[n];
    58             numTemp[n] = numTemp[m];
    59             numTemp[m] = cTemp;
    60         }
    61 
    62         for(int t = num2.size() - 1; t > i; t--)
    63         {
    64             numTemp.push_back('0');
    65         }
    66 
    67         result = result + numTemp;
    68         numTemp.clear();
    69     }
    70     return result;
    71 }
    72 
    73 class Solution {
    74 public:
    75     string multiply(string num1, string num2) {
    76         string ret;
    77         string zero = "0";
    78         if(!num1.compare(zero) || !num2.compare(zero)){
    79             ret = "0";
    80             return ret;
    81         }
    82         ret = num1 * num2;
    83         return ret;
    84     }
    85 };
     
  • 相关阅读:
    TCP传输粘包问题
    提取KIndle中每本书的笔记并单独保存
    # 可视化工具资源汇总
    抓取代理IP
    Linux 小工具学习之(1)——Wget十例[翻译]
    [转]关于矩阵的本质
    用2263份证件照图片样本测试how-old.net的人脸识别
    Python生成二维码脚本
    基于git的源代码管理模型——git flow
    使用Graphviz绘图(一)
  • 原文地址:https://www.cnblogs.com/4everlove/p/3650326.html
Copyright © 2011-2022 走看看