zoukankan      html  css  js  c++  java
  • 大数乘法(分块)

    对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。

        如图【1.jpg】表示了分块乘法的原理。可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。

        以下代码示意了分块乘法的原理(乘数、被乘数都分为2段)。

    void bigmul(int x, int y, int r[])

    {

           int base = 10000;

           int x2 = x / base;

           int x1 = x % base;

           int y2 = y / base;

           int y1 = y % base;

           int n1 = x1 * y1;

           int n2 = x1 * y2;

           int n3 = x2 * y1;

           int n4 = x2 * y2;

           r[3] = n1 % base;

           r[2] = n1 / base + n2 % base + n3 % base;

           r[1] = ____________________________________________; // 填空

           r[0] = n4 / base;

          

           r[1] += _______________________;  // 填空

           r[2] = r[2] % base;

           r[0] += r[1] / base;

           r[1] = r[1] % base;

    }

    int main(int argc, char* argv[])

    {

           int x[] = {0,0,0,0};

           bigmul(87654321, 12345678, x);

           printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);

           return 0;

    }

     1 #include <cstdio>
     2 void bigmul(int x, int y, int r[])
     3 {
     4     int base = 10000;//每个
     5     int x2 = x / base;
     6     int x1 = x % base;
     7     int y2 = y / base;
     8     int y1 = y % base;
     9 
    10     int n1 = x1 * y1;
    11     int n2 = x1 * y2;
    12     int n3 = x2 * y1;
    13     int n4 = x2 * y2;
    14 
    15     r[3] = n1 % base;
    16     r[2] = n1 / base + n2 % base + n3 % base;
    17     r[1] = n3/base+n2/base+n4%base; // 填空
    18     r[0] = n4 / base;
    19 
    20     r[1] += r[2]/base;  // 填空
    21     r[2] = r[2] % base;
    22     r[0] += r[1] / base;
    23     r[1] = r[1] % base;
    24 }
    25 int main(int argc, char* argv[])
    26 {
    27     int x[] = {0,0,0,0};
    28     bigmul(87654321, 12345678, x);
    29     printf("%d %d %d %d\n", x[0],x[1],x[2],x[3]);
    30     while(1);
    31     return 0;
    32 }
  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3059966.html
Copyright © 2011-2022 走看看