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

大数乘法问题一般可以通过将大数转换为数组来解决。

解题思路

第1步

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

第2步

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

第3步

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

第4步

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

样例输入1
56 744
样例输出1
800
样例输入2
-10 678
样例输出2
-6780
样例输入3
1234567890 45678901234
样例输出3
56393704713977776260

代码实现

#include<stdio.h>
#include<string.h>
#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;
}
上一篇:PAT Basic1003 我要通过


下一篇:读取文件进行绘图