C language unsigned integer high precision algorithm trial writing

I entered the CS major in my freshman year. I heard that there is a software design competition in the department, so I wanted to sign up and try it out. I planned to write a multi-function calculator. At present, high-precision addition, subtraction, and multiplication (integer) has been realized.
The idea is probably:
1. Obtain two operands through strings.
2. Use loop to store to integer array.
3. Use loops to do calculations.
4. Use the loop to output the array.
The code is as follows: (The space will be a few more bytes when malloc is used, so I am too lazy to allocate it accurately. However, it saves a lot of memory than a[9999].

#define _CRT_SECURE_NO_WARNINGS


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

extern void add(int d);//加法函数声明,d=1表示显示没有用但是看起来很爽的过程
extern void sub(int d);//减法函数声明,d=1表示显示没有用但是看起来很爽的过程
extern void mul(int d);//乘法函数声明,d=1表示显示没有用但是看起来很爽的过程


extern void add(int d)
{
    int *a, *b;
    char s1[9999], s2[9999];
    int la, lb, M;
    int i;
    printf("高精度加法开始......\n");
    printf("请输入要计算的第一个数:\n");
    scanf("%s", s1);//输入第一个数
    printf("请输入要计算的第二个数:\n");
    scanf("%s", s2);//输入第二个数
    la = strlen(s1);//取第一个数长度
    lb = strlen(s2);//取第二个数长度
    a = (int*)malloc(sizeof(int)*(la + 2));//分配空间储存加法操作数
    b = (int*)malloc(sizeof(int)*(lb + 2));//分配空间储存加法操作数
    if (d == 1)
    {
        Sleep(500);
        printf("-----空间分配完毕\n");
    }
    for (i = 0; i <= la + 1; i++)//加法操作数置零
        a[i] = 0;

    for (i = 0; i <= lb + 1; i++)//加法操作数置零
        b[i] = 0;

    if (d == 1)
    {
        Sleep(500);
        printf("-----初始操作数置零完毕\n");
    }
    a[0] = la;//存储位数
    b[0] = lb;//存储位数
    /*记录下来位数,本来以为的功能可能会用到,但是觉得要用太麻烦了,就没打算用,也懒得改了。*/
    if (la >= lb)
        M = la;
    else
        M = lb;
    for (i = 1; i <= la; i++)//倒序存储
    {
        a[i] = s1[a[0] - i] - '0';
    }
    for (i = 1; i <= lb; i++)//倒序存储
    {
        b[i] = s2[b[0] - i] - '0';
    }
    if (d == 1)
    {
        Sleep(500);
        printf("-----操作数存储完毕\n");
    }
    if (d == 1)
    {
        Sleep(500);
        printf("-----开始计算\n");
    }
    for (i = 1; i <= M; i++)//竖式加法
    {
        a[i + 1] += (a[i] + b[i]) / 10;//进位
        a[i] = (a[i] + b[i]) % 10;
    }
    if (a[i] > 0)//判断最高位是否进位
        a[0] += 1;

    printf("计算结果为:");
    for (i = a[0]; i >= 1; i--)
        printf("%d", a[i]);

    free(a);
    free(b);
    if (d == 1)
        printf("\n-----内存空间释放完毕");
    system("pause");
}

extern void sub(int d)
{
    int *a, *b;
    char s1[9999], s2[9999];
    int la, lb, M, f;//f=1代表结果为正,反之为负
    int i;
    printf("高精度减法开始......\n");
    printf("请输入要计算的第一个数:\n");
    scanf("%s", s1);//输入第一个数
    printf("请输入要计算的第二个数:\n");
    scanf("%s", s2);//输入第二个数
    if (strcmp(s1, s2) == 0)//如果两个操作数相等
    {
        printf("计算结果为:0");
        goto A;
    }
    la = strlen(s1);//取第一个数长度
    lb = strlen(s2);//取第二个数长度
    if (la >= lb)
        M = la;
    else
        M = lb;
    a = (int*)malloc(sizeof(int)*(M + 2));//分配空间储存减法操作数
    b = (int*)malloc(sizeof(int)*(M + 2));//分配空间储存减法操作数
    if (d == 1)
    {
        Sleep(500);
        printf("-----空间分配完毕\n");
    }
    for (i = 0; i <= la + 1; i++)//减法操作数置零
        a[i] = 0;

    for (i = 0; i <= la + 1; i++)//减法操作数置零
        b[i] = 0;
    if (d == 1)
    {
        Sleep(500);
        printf("-----初始操作数置零完毕\n");
    }

    a[0] = la;//存储位数
    b[0] = lb;//存储位数
    /*记录下来位数,本来以为的功能可能会用到,但是觉得要用太麻烦了,就没打算用,也懒得改了。*/
    for (i = 1; i <= M; i++)//倒序存储
    {
        if (i <= la)
            a[i] = s1[a[0] - i] - '0';
        else
            a[i] = 0;
    }
    for (i = 1; i <= M; i++)//倒序存储
    {
        if (i <= lb)
            b[i] = s2[b[0] - i] - '0';
        else
            b[i] = 0;
    }
    if (d == 1)
    {
        Sleep(500);
        printf("-----操作数存储完毕\n");
    }
    if (d == 1)

    {
        Sleep(500);
        printf("-----开始计算\n");
    }
    if (a[0] > b[0])//依据位数比较大小
        f = 1;
    else
    {
        if (a[0] < b[0])//依据位数比较大小
            f = 0;
        else
        {
            for (i = a[0]; i>0; i--)//从高位开始比较大小
            {
                if (a[i] > b[i])
                    f = 1;
                if (a[i] < b[i])
                    f = -1;
            }
        }
    }
    if (f == 1)//竖式减法
    {
        for (i = 1; i <= M; i++)
        {
            if (a[i] < b[i])//借位
            {
                a[i + 1] -= 1;
                a[i] = 10 - b[i] + a[i];
            }
            else
            {
                a[i] = a[i] - b[i];
            }

        }
        for (i = a[0]; i >= 1; i--)
        {
            if (a[a[0]] == 0 && i == a[0])//如果第一位为0则不输出第一位
                continue;
            printf("%d", a[i]);
        }
        free(a);
        free(b);
    }
    else
    {
        for (i = 1; i <= M; i++)
        {
            if (b[i] < a[i])//借位
            {
                b[i + 1] -= 1;
                b[i] = 10 - a[i] + b[i];
            }
            else
            {
                b[i] = b[i] - a[i];
            }

        }
        printf("计算结果为:");
        printf("结果为负数:\n");
        for (i = b[0]; i >= 1; i--)
        {
            if (b[b[1]] == 0 && i == b[0])//如果第一位为0则不输出第一位
                continue;
            printf("%d", b[i]);
        }
        free(a);
        free(b);
    }
    if (d == 1)
        printf("\n-----内存空间释放完毕");
A://goto标号点
    system("pause");
}

extern void mul(int d)
{
    int *a, *b, *c;
    int i, j, la, lb;
    char s1[9999], s2[9999];
    printf("高精度乘法开始......\n");
    printf("请输入要计算的第一个数:\n");
    scanf("%s", s1);//输入第一个数
    printf("请输入要计算的第二个数:\n");
    scanf("%s", s2);//输入第二个数
    la = strlen(s1);//取第一个数长度
    lb = strlen(s2);//取第二个数长度
    a = (int*)malloc(sizeof(int)*(la + 2));//分配空间储存乘法操作数
    b = (int*)malloc(sizeof(int)*(lb + 2));//分配空间储存乘法操作数
    c = (int*)malloc(sizeof(int)*(la + lb + 2));//分配空间储存乘法计算结果
    if (d == 1)
    {
        Sleep(500);
        printf("-----空间分配完毕\n");
    }
    for (i = 0; i <= la + 1; i++)//乘法操作数置零
        a[i] = 0;

    for (i = 0; i <= lb + 1; i++)//乘法操作数置零
        b[i] = 0;

    if (d == 1)
    {
        Sleep(500);
        printf("-----初始操作数置零完毕\n");
    }

    for (i = 0; i <= la + lb + 1; i++)//乘法计算结果置零
        c[i] = 0;

    for (i = la - 1, j = 0; i >= 0; i--, j++)//倒序存储
        a[j] = s1[i] - '0';

    for (i = lb - 1, j = 0; i >= 0; i--, j++)//倒序存储
        b[j] = s2[i] - '0';

    if (d == 1)
    {
        Sleep(500);
        printf("-----操作数存储完毕\n");
    }

    for (i = 0; i < la; i++)//无进位竖式乘法
    {
        for (j = 0; j < lb; j++)
            c[i + j] += a[i] * b[j];
    }
    if (d == 1)
    {
        Sleep(500);
        printf("-----无进位计算开始\n");
    }
    for (i = 0; i <= la + lb; i++)//进位处理
    {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    if (d == 1)
    {

Sleep(500);
        printf("-----进位处理开始\n");
    }
    while (!c[i] && i >= 0)//输出位数计算
        i--;

    printf("计算结果为:");
    if (i == -1)
    {
        printf("0");
    }
    else
    {
        while (i >= 0)
            printf("%d", c[i--]);
    }
    free(a);
    free(b);
    free(c);
    if (d == 1)
        printf("\n-----内存空间释放完毕");
    system("pause");
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325798776&siteId=291194637