zoukankan      html  css  js  c++  java
  • 大整数乘法

    1.引言

    用计算机实现两个比较小的数相乘不是一件难事,但是当两个数很大,比如11111987654321和55443322111相乘,由于计算机的精度是有限的,所以用编程语言提供的原子数据类型来直接完成这两个大数的乘法显然不切实际。

    2.运用数组

    运用两个数组分别存储两个大数的每一位,这样首先解决了大数的存储问题,然后按照乘法的基本规则对这两个大数进行运算即可,下面通过程序一步一步解释。

     

     1 /************************************************
     2 
     3 Copyright:1.0
     4 
     5 Author: 太白路上的小混混
     6 
     7 Date:2014-12-4
     8 
     9 Description:Implement multiplication of two large 
    10             numbers
    11 
    12 *************************************************/
    13 #include <iostream>
    14 using namespace std;
    15 
    16 /*************************************************
    17 Function:       multi
    18 Description:    Implement multiplication of two 
    19                 large numbers
    20 Input:          Two large numbers stored in two 
    21                 arrays respectly;
    22                 The sizes of the two arrays.
    23 Output:         A array storing the product of 
    24                 the two large numbers
    25 *************************************************/
    26 int* multi(int* firstNumber, const unsigned firstSize, int* secondNumber, const unsigned secondSize)
    27 {
    28     //建立一个足够大的矩阵来保存乘积结果的每一位
    29     const unsigned  sz = firstSize + secondSize;
    30     int* result = new int[sz];
    31     for (unsigned i = 0; i < sz; ++i)
    32     {
    33         result[i] = 0;
    34     }
    35 
    36     //利用乘法规则,用第二个数的每一位去乘以第一个
    37     //数的每一位.先不考虑进位
    38     for (unsigned i = 0; i < secondSize; ++i)
    39     {
    40         unsigned k = i;
    41         for (unsigned j = 0; j < firstSize; ++j)
    42         {
    43             result[k++] += secondNumber[i] * firstNumber[j];
    44         }
    45     }
    46     //在上面一步操作结束之后,对每一位进行进位检查,如果某位大于10,
    47     //根据具体大小向前一位进位
    48     for (unsigned i = 0; i < sz; ++i)
    49     {
    50         if (result[i] >= 10)
    51         {
    52             result[i+1] += result[i] / 10;
    53             result[i] %= 10;
    54         }
    55     }
    56     return result;
    57 }
    58 
    59 int main()
    60 {
    61     //数组存储数据的方式是低位在前,高位在后,所以下面两个数
    62     //分别是11111123456789和55444333222111
    63     int firstNumber[] = {1,2,3,4,5,6,7,8,9,1,1,1,1,1};
    64     int secondNumber[] = {1,1,1,2,2,2,3,3,3,4,4,4,5,5};
    65     int* result = multi(firstNumber, 14, secondNumber, 14);
    66 
    67     //逐位输出
    68     for (int i = 27; i >= 0; i--)
    69     {
    70         cout << result[i];
    71     }
    72     delete[] result;
    73     return 0;
    74 }

    运行结果:

    3.总结

    这是用数组这种结构解决问题的一个典型例子

    调试开始的时候第66行:

    for (unsigned i = 27; i >= 0; i--)

    这样会使得程序陷入无限循环,因为当 无符号 i 为0之后,继续减 1 会变成一个无限大的另一个无符号正数,这也暴露了数组这种结构不检查边界的缺陷,编程过程中程序员自己需要保证边界的正确性!

    
    
    
  • 相关阅读:
    Android启动过程介绍
    第九届蓝桥杯Java B组
    二分模板和区别
    第十届蓝桥杯Java B组
    2019 ICPC Asia Nanjing Regional(现场赛)
    PAT 甲级 1057 Stack
    P1972 [SDOI2009]HH的项链
    Python中的字典排序
    Comet OJ
    ekmp模板
  • 原文地址:https://www.cnblogs.com/90zeng/p/large_number.html
Copyright © 2011-2022 走看看