• 【LeetCode】大数相乘


    1. 模拟手工计算

    原理:

    1. 将 string 反转存储在 int 数组中,如 A = 17 = (7, 1),B = 25 = (5, 2),亦即幂表示法,幂次是从低位到高位。
    2. 作逐位相乘,即 ai × bj,结果加入到积 C 的第 i+j 位,消除高位的 0,最后处理进位。
      C = A × B = (7 × 5, 1 × 5 + 7 × 2, 1 × 2) = (35, 19, 2) -> (5, 22, 2) -> (5, 2, 4)
    3. 将 int 数组逆序转换为 string,C = (5, 2, 4) = 425。
     1 string multiply(string num1, string num2) {
     2     vector<int> n1 = string2Int(num1), n2 = string2Int(num2);
     3     vector<int> result = mul(n1, n2);
     4     return int2String(result);
     5 }
     6     
     7 vector<int> string2Int(string s) {
     8     vector<int> v;
     9     for (int i = s.size() - 1; i >= 0; i--)
    10         v.push_back(s[i] - '0');
    11     return v;
    12 }
    13     
    14 vector<int> mul(vector<int> n1, vector<int> n2) {
    15     vector<int> result(n1.size() + n2.size(), 0);
    16     /* 逐位相乘 */
    17     for (int i = 0; i < n1.size(); i++)
    18         for (int j = 0; j < n2.size(); j++)
    19             result[i + j] += n1[i] * n2[j];
    20     /* 消除多余的0 */
    21     for (int i = result.size() - 1; i > 0 && result[i] == 0; i--)
    22         result.pop_back();
    23     /* 进位 */
    24     int c = 0;
    25     for (int i = 0; i < result.size(); i++) {
    26         result[i] += c;
    27         c = result[i] / 10;
    28         result[i] %= 10;
    29     }
    30     if (c)
    31         result.push_back(c);
    32     return result;
    33 }
    34     
    35 string int2String(vector<int> v) {
    36     string s = "";
    37     for (int i = v.size() - 1; i >= 0; i--)
    38         s += to_string(v[i]);
    39     return s;
    40 }

     PS:

    char 转 int   ——  ch - '0'

    int 转 char   ——  i + '0'

    int 转 string  ——  to_string(i)

    【char 就是一种特殊的 int 啊有木有!!!】

    另外还有两种较为复杂的算法,在下实力有限,没有研究透。

    2. 分治法

    当把大整数分为 2 段时,算法时间复杂度最低,为 O(n^log23) = O(n1.58)

    3. FFT法(快速傅里叶变换)

    时间复杂度 O(nlogn)

  • 相关阅读:
    Theme.AppCompat.Light报错
    在Eclipse添加Android兼容包( v4、v7 appcompat )
    如何从Eclipse导入github上的项目源码
    一个C#多线程的工作队列
    是否需要手动执行DataContext的Dispose方法?
    Unity3d 销毁
    Unity3d 碰撞检测
    unity3d 鼠标事件
    Unity3d 刚体
    unity3d 让物体移动到点击位置
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/7210316.html
Copyright © 2020-2023  润新知