zoukankan      html  css  js  c++  java
  • 蓝桥杯 第三届C/C++预赛真题(6) 大数乘法(数学题)

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

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

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

     1 void bigmul(int x, int y, int r[])
     2 {
     3     int base = 10000;
     4     int x2 = x / base;
     5     int x1 = x % base; 
     6     int y2 = y / base;
     7     int y1 = y % base; 
     8 
     9     int n1 = x1 * y1; 
    10     int n2 = x1 * y2;
    11     int n3 = x2 * y1;
    12     int n4 = x2 * y2;
    13 
    14     r[3] = n1 % base;
    15     r[2] = n1 / base + n2 % base + n3 % base;
    16     r[1] = ____________________________________________; // 填空
    17     r[0] = n4 / base;
    18     
    19     r[1] += _______________________;  // 填空
    20     r[2] = r[2] % base;
    21     r[0] += r[1] / base;
    22     r[1] = r[1] % base;
    23 }
    24 
    25 
    26 int main(int argc, char* argv[])
    27 {
    28     int x[] = {0,0,0,0};
    29 
    30     bigmul(87654321, 12345678, x);
    31 
    32     printf("%d%d%d%d
    ", x[0],x[1],x[2],x[3]);
    33 
    34     return 0;
    35 }

    请分析代码逻辑,并推测划线处的代码。

    答案写在 “解答.txt” 文件中

    注意:只写划线处应该填的内容,划线前后的内容不要抄写。


      数学题

      自己演算一遍再对照着原理图就能明白原理。

      答案

    n2 / base + n3 / base + n4 % base
    r[2] / base

      代码

     1 #include <stdio.h>
     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] = n2 / base + n3 / 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 
    26 
    27 int main(int argc, char* argv[])
    28 {
    29     int x[] = {0,0,0,0};
    30 
    31     bigmul(87654321, 12345678, x);
    32 
    33     printf("%d%d%d%d
    ", x[0],x[1],x[2],x[3]);
    34 
    35     return 0;
    36 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/yym2013/p/3603092.html
Copyright © 2011-2022 走看看