zoukankan      html  css  js  c++  java
  • 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.

    思路:

    大整数乘法,转换成大整数加法来算。

    代码:

     1     string add(string num1, string num2){
     2         int l1 = num1.length(), l2 = num2.length();
     3         if(l1 > l2)
     4             return add(num2, num1);
     5         int i;
     6         int carry = 0;
     7         string result = "";
     8         for(i = l1-1; i >= 0; i--){
     9             int tmp = num1[i] - '0' + num2[i+l2-l1] - '0' + carry;
    10             result = (char)(tmp%10 + '0') + result;
    11             carry = tmp/10;
    12         }
    13         for(i = l2-l1-1; i >= 0; i--){
    14             int tmp = num2[i] - '0' + carry;
    15             result = (char)(tmp%10 + '0') + result;
    16             carry = tmp/10;
    17         }
    18         if(carry > 0)
    19             result = (char)(carry + '0') + result;
    20         return result;
    21     }
    22     string multiply(string num1, string num2) {
    23         // IMPORTANT: Please reset any member data you declared, as
    24         // the same Solution instance will be reused for each test case.
    25         int l1 = num1.length(), l2 = num2.length();
    26         if(l1 < l2)
    27             return multiply(num2, num1);
    28         if(l1 == 0)
    29             return "";
    30         if(l1 == 1){
    31             if(num1[0] == '0')
    32                 return "0";
    33             if(num1[0] == '1')
    34                 return num2;
    35         }
    36         int i,j;
    37         string result = "";
    38         for(i = l2-1; i >= 0; i--){
    39             string tstring = "";
    40             int carry = 0;
    41             if(num2[i] == '0')
    42                 continue;
    43             for(j = l1-1; j >= 0; j--){
    44                 int tmp = (num2[i]-'0')*(num1[j]-'0') + carry;
    45                 tstring = (char)(tmp%10 + '0') + tstring;
    46                 carry = tmp/10;
    47             }
    48             if(carry > 0)
    49                 tstring = (char)(carry + '0') + tstring;
    50             for(int k = 0; k < l2-i-1; k++)
    51                 tstring += '0';
    52             if(result == "")
    53                 result = tstring;
    54             else
    55                 result = add(result, tstring);
    56         }
    57         if(result == "")
    58             return "0";
    59         return result;
    60     }

     第一遍的方法比较麻烦,其实还可以先用int数组存中间结果,然后再转换为字符串。代码如下:

     1     string multiply(string num1, string num2) {
     2         if(num1 == "0" || num2 == "0")
     3             return "0";
     4         int l1 = num1.length(), l2 = num2.length();
     5         int *n1 = new int[l1], *n2 = new int[l2], *r = new int[l1+l2];
     6         int i,j;
     7         string result = "";
     8         for(i = 0; i < l1; i++)
     9             n1[i] = num1[i]-'0';
    10         for(i = 0; i < l2; i++)
    11             n2[i] = num2[i]-'0';
    12         memset(r, 0, sizeof(int)*(l1+l2));
    13         for(i = 0; i < l1; i++){
    14             for(j = 0; j < l2; j++){
    15                 r[i+j+1] += n1[i]*n2[j];
    16             }
    17         }
    18         for(i = l1+l2-1; i >= 1; i--){
    19             result = (char)(r[i]%10+'0')+result;
    20             r[i-1] += (r[i]/10);
    21         }
    22         if(r[0] > 0)
    23             result = (char)(r[0]+'0')+result;
    24         return result;
    25     }
  • 相关阅读:
    Docker容器(分享十五)
    oracle数据库迁移主从复制ADG(分享十四)
    mysql数据库迁移主从复制(分享十三)
    rsync+inotify实现服务器之间文件实时同步(分享十三)
    mysql数据库迁移(分享十二)
    数据库迁移(分享十一续集)
    Codeforces 1185G2 Playlist for Polycarp (hard version) 背包,暴力
    Codeforces 747F Igor and Interesting Numbers DP 组合数
    Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火
    Codeforces 1140F 线段树 分治 并查集
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3443086.html
Copyright © 2011-2022 走看看