大数乘法(A * B Problem Plus)问题

文章目录

    • 1.解题思路:
      • 1.1 第1步
      • 1.2 第2步
      • 1.3 第3步
      • 1.4 第4步
    • 2.样例
    • 3.代码实现

1.解题思路:

1.1 第1步

大数乘法(A * B Problem Plus)问题_第1张图片

1.2 第2步

大数乘法(A * B Problem Plus)问题_第2张图片

1.3 第3步

大数乘法(A * B Problem Plus)问题_第3张图片

1.4 第4步

大数乘法(A * B Problem Plus)问题_第4张图片

2.样例

输入1:

56 744

输出1:

800

输入2:

-10 678

输出2:

-6780

输入3:

1234567890 45678901234

输出3:

56393704713977776260

3.代码实现

#include
#include
#define MAX 1000

// 大数乘法
void Multiply(char* tempA, char* tempB, int* prod, int lenA, int lenB)
{
    for (int i = 0; i < lenA; i++)
    {
        for (int j = 0; j < lenB; j++)
        {
            prod[i+j] += (tempA[i] - '0')*(tempB[j] - '0');
        }
    }

    for (int i = lenA + lenB - 1 - 1; i > 0; i--)
    {
        // 如果本位大于9,则保留本位数的个位,十位向左进位
        if (prod[i] > 9)
        {
            prod[i-1] += prod[i] / 10;
            prod[i] %= 10;
        }
    }
}

int main()
{
    char strA[MAX] = {0};
    char strB[MAX] = {0};

    while (scanf("%s%s", strA, strB) != EOF)
    {
        char tempA[MAX] = {0};
        char tempB[MAX] = {0};
        int prod[2*MAX] = {0};

        int lenA = 0;
        int lenB = 0;
        int negNumA = 0;
        int negNumB = 0;

        lenA = strlen(strA);        // 计算字符串A的长度
        lenB = strlen(strB);        // 计算字符串A的长度

        // 去掉字符串A和B的负号
        if (strA[0] == '-')
        {
            negNumA++;
            lenA--;
        }
        if (strB[0] == '-')
        {
            negNumB++;
            lenB--;
        }

        // 把去掉负号的字符串存储到temp数组中
        for (int i = 0; i < lenA; i++)
        {
            tempA[i] = strA[i+negNumA];
        }
        for(int j = 0; j < lenB; j++)
        {
            tempB[j] = strB[j+negNumB];
        }

        Multiply(tempA, tempB, prod, lenA, lenB);

        // 如果prod数组的第一个元素是0,则直接输出0,如100*0=000,输出0
        if (prod[0] == 0)
        {
            printf("%d", prod[0]);
        }
        // 打印负号
        if (negNumA + negNumB == 1)
        {
            printf("-");
        }

        // 打印A*B的结果,N位数和M位数相乘的最大位数为N+M
        for (int i = 0; i < lenA + lenB - 1; i++)
        {
            if (prod[0] != 0)
            {
                printf("%d", prod[i]);
            }
        }

        printf("\n");

    }
    return 0;
}

个人主页:

www.codeapes.cn

你可能感兴趣的:(C)