zoukankan      html  css  js  c++  java
  • 大数相乘

    问题:

      两个大数相乘,无法用计算机中现有的类型直接进行操作,因为表示范围有限。两个大数是通过字符串表示的。

    解决思路:

      将输入的字符串转换成char数组,在转成int数组,采用分治思想,每一位进行相乘。

    公式:

      AB*CD = AC(BC+AD)BD ,然后从后到前满10进位。

      摆放成另一种形式就看的清楚了:

        A              B 

                      *

        C              D

      =     AC   BC    BD

              AD

    这个乘法的形式其实就是模拟手工做乘法的过程。乘完了之后BC和AD处于同等的地位,是相加的关系。

    例:

      67*89 = 6*8(7*8 + 6*9)7*9  

      67*89 = 48(110)63

    从后到前满10进位:

      63进6剩余3,110变成116,满十进位,进行11,剩余6,48变成59。所以结果: 5963

    代码:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 string multiply(string num1, string num2)
     6 {
     7     int size1 = num1.size();
     8     int size2 = num2.size();
     9     
    10     if(size1 < 1 || size2 < 1)
    11         return "";
    12     
    13     int *result = new int[size1 + size2];
    14     int *n1 = new int[size1];
    15     int *n2 = new int[size2];
    16     
    17     for(int i = 0; i < size1; i++)
    18     {
    19         n1[i] = num1[i] - '0';
    20     }
    21     
    22     for(int i = 0; i < size2; i++)
    23     {
    24         n2[i] = num2[i] - '0';
    25     }
    26     
    27     for(int i = 0; i < size1; i++)
    28     {
    29         for(int j = 0; j < size2; j++)
    30         {
    31             result[i+j] += n1[i] * n2[j];
    32         }
    33     }
    34     
    35     for(int i = size1 + size2 - 1; i > 0; i--)
    36     {
    37         result[i - 1] += result[i] / 10;
    38         result[i] = result[i] % 10;
    39     }
    40     
    41     string ret = "";
    42     for(int i = 0; i < size1 + size2 - 1; i++)
    43     {
    44         ret += to_string(result[i]);
    45     }
    46     
    47     return ret;
    48 }
    49 
    50 int main()
    51 {
    52     string ret = multiply("67", "89");
    53     std::cout << "result : " << ret << std::endl;
    54     
    55     return 0;
    56 }

    运行结果:

     

  • 相关阅读:
    算法-最大公约数
    算法-最大连续子序列和
    iOS开发-Bug锦囊
    iOS开发-简单抽奖
    iOS开发-UIActionSheet简单介绍
    iOS开发-UIActivityIndicatorView简单使用
    iOS开发-UITextView实现PlaceHolder的方式
    iOS开发-Reachability实时检测Wifi,2G/3G/4G/网络状态
    [转]jsPlumb插件做一个模仿viso的可拖拉流程图
    Python 日期和时间
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13492841.html
Copyright © 2011-2022 走看看