乘法实现
乘法实现
大数乘法
伪码描述
C语言实现
#include <stdio.h>
#include <stdlib.h>
/* 大数乘法 */
int main() {
int m, n;
scanf("%d%d", &m, &n);
//对于malloc函数的底层实现不清楚,但scanf可以得到正确的字符数组
char *x = (char *)malloc(sizeof(char) * m);
char *y = (char *)malloc(sizeof(char) * n);
//因为z是一个累加的数组,所以这里使用int型数组存储
int *z = (int *)malloc(sizeof(int) * (m + n));
scanf("%s%s", x, y);
//初始化z数组
for (int i = 0; i < m + n; i++) z[i] = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
z[i + j + 1] += (x[i] - '0') * (y[i] - '0');
}
}
for (int k = m + n - 1; k > 0; k--) {
if (z[k] >= 10) {
z[k - 1] += z[k] / 10;
z[k] = z[k] % 10;
}
}
if (z[0] != 0) printf("%d", z[0]);
for (int i = 1; i < m + n; i++) printf("%d", z[i]);
return 0;
}
机器级乘法实现
伪代码
C语言实现
Don't let the iterative pseudocode fool you; the algorithm is fundamentally recursive!
#include <stdio.h>
//递归函数
int peasantMul(int x, int y) {
if (x == 0 || y == 0) return 0;
if (x & 1)
return y + peasantMul(x >> 1, y << 1);
else
return peasantMul(x >> 1, y << 1);
}
//迭代版本
int main() {
int x, y;
scanf("%d%d", &x, &y);
int prod = 0;
while (x > 0) {
if (x & 1) prod = prod + y;
x = x >> 1;
y = y << 1;
}
printf("%d", prod);
return 0;
}
由于这个是按照 x 进行二分,时间复杂度为 O(log(x)) 。对于 x>>y 的时间复杂度会较高,所以可以首先判断 x和y 的大小,将 x 置为较小的值, 可以降低时间复杂度为 O(min(x,y))。

浙公网安备 33010602011771号