solution.md 3.0 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 大数乘法
F
fix bug  
feilong 已提交
2

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

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


## aop
F
fix bug  
feilong 已提交
10

每日一练社区's avatar
每日一练社区 已提交
11
### before
F
fix bug  
feilong 已提交
12

每日一练社区's avatar
每日一练社区 已提交
13 14 15 16
```cpp
#include <stdio.h>
```
### after
F
fix bug  
feilong 已提交
17

每日一练社区's avatar
每日一练社区 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31
```cpp
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;
}
```

## 答案
F
fix bug  
feilong 已提交
32

每日一练社区's avatar
每日一练社区 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
```cpp
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] = n2 / base + n3 / base + n4 % base; 
    r[0] = n4 / base;

    r[1] += r[2] / base; 
    r[2] = r[2] % base;
    r[0] += r[1] / base;
    r[1] = r[1] % base;
}
```
## 选项

F
fix bug  
feilong 已提交
60

每日一练社区's avatar
每日一练社区 已提交
61
### A
F
fix bug  
feilong 已提交
62

每日一练社区's avatar
每日一练社区 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
```cpp
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] = n2 / base + n3 / base + n4 % base; 
    r[0] = n4 / base;

    r[1] += r[2] % base; 
    r[2] = r[2] / base;
    r[0] += r[1] / base;
    r[1] = r[1] % base;
}
```

### B
F
fix bug  
feilong 已提交
90

每日一练社区's avatar
每日一练社区 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
```cpp
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] = n2 / base + n3 / base + n4 / base; 
    r[0] = n4 / base;

    r[1] += r[2] / base; 
    r[2] = r[2] % base;
    r[0] += r[1] / base;
    r[1] = r[1] % base;
}
```

### C
F
fix bug  
feilong 已提交
118

每日一练社区's avatar
每日一练社区 已提交
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
```cpp
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] = n2 / base + n3 % base + n4 / base; 
    r[0] = n4 / base;

    r[1] += r[2] / base; 
    r[2] = r[2] % base;
    r[0] += r[1] / base;
    r[1] = r[1] % base;
}
```