乘法实现

乘法实现

大数乘法

伪码描述

image-20201125165141963

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;
}

机器级乘法实现

伪代码

image-20201125165316053

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))

posted @ 2021-02-20 22:43  snakeee  阅读(55)  评论(0)    收藏  举报