C语言实现大数乘法(十进制版)

1.大数加法.

int big_num_add(unsigned long *a, unsigned long *b, unsigned long *c, int len)
{
    int u = 0;
    int v = 0;
    int i = 0;

    for(i=len-1; i>=0; i--)
    {
        if(a[i] > 99999999 || b[i] > 99999999)
        {
            printf("数字超限\n");
            return -1;
        }

        c[i] = a[i] + b[i];

        if(c[i] > 99999999)
        {
            c[i] -= 100000000;
            u = 1;
        }
        else
        {
            u = 0;
        }

        if(c[i] + v > 99999999)
        {
            c[i] += v;
            c[i] -= 100000000;
            u = 1;
        }
        else
        {
            c[i] += v;
        }

        v = u;
    }

    return v;
}

2.亿位乘法.

int big_num_mul_long(unsigned long a, unsigned long b, unsigned long *c)
{
    unsigned long d[2];
    unsigned long e[2];
    unsigned long f[2];
    unsigned long g[2];
    unsigned long h[2];
    unsigned short q[10];

    memset(d, 0x00, sizeof(d));
    memset(e, 0x00, sizeof(e));
    memset(f, 0x00, sizeof(f));
    memset(g, 0x00, sizeof(g));

    q[3] = b % 10000;
    q[2] = b / 10000;
    q[1] = a % 10000;
    q[0] = a / 10000;

    d[0] = q[0] * q[2];
    e[1] = q[1] * q[3];

    f[0] = q[0] * q[3];
    q[4] = f[0] / 10000;
    q[5] = f[0] % 10000;
    f[0] = q[4];
    f[1] = q[5] * 10000;

    g[0] = q[1] * q[2];
    q[4] = g[0] / 10000;
    q[5] = g[0] % 10000;
    g[0] = q[4];
    g[1] = q[5] * 10000;

    big_num_add(d, e, h, 2);
    big_num_add(h, f, d, 2);
    big_num_add(d, g, c, 2);

    return 0;
}

3.大数乘法

int big_num_mul(unsigned long *a, unsigned long *b, unsigned long *c, int len)
{
    unsigned long d[2*len];
    unsigned long e[2*len];
    unsigned long f[2*len];
    unsigned long g[2*len];
    unsigned long h[2*len];
    int u = len;
    int v = len * 2;
    int w = len / 2;

    memset(c, 0x00, 2*len);

    //(ax+c)(bx+d) = abx^2+(ad+bc)x+cd;

    if(u != 1)
    {
        big_num_mul(a, b, d, w);
        printf("1: ");
        print_num(d, v);
        big_num_mul(a+w, b+w, e+2*w, w);
        printf("2: ");
        print_num(e, v);
        big_num_mul(a, b+w, f+w, w);
        printf("3: ");
        print_num(f, v);
        big_num_mul(a+w, b, g+w, w);
        printf("4: ");
        print_num(g, v);
        big_num_add(d, e, h, v);
        printf("5: ");
        print_num(h, v);
        big_num_add(h, f, d, v);
        printf("6: ");
        print_num(d, v);
        big_num_add(d, g, c, v);
        printf("7: ");
        print_num(c, v);
    }
    else
    {
        big_num_mul_long(*a, *b, c);
        printf("0: ");
        print_num(c, 2);
    }

    return 0;
}

4.头文件.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

5.输出函数.

int print_num(unsigned long *a, int len)
{
    int i = 0;

    printf("num=[");

    for(i=0; i<len; i++)
    {
        printf("%08d", a[i]);
    }

    printf("]\n");

    return 0;
}

6.主函数.

int main()
{
    unsigned long a[10] = {12345678, 56781234, 0,0,0,0,0,0,0,0};
    unsigned long b[10] = {87654321, 43218765, 0,0,0,0,0,0,0,0};
    unsigned long c[10] = {0};
    int i = 0;

    big_num_mul(a, b, c, 2);

    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容