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


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

    解题思路

    第1步

    ZSHTXj.png

    第2步

    ZSHq7q.png

    第3步

    ZSHHns.png

    第4步

    ZSHbBn.png

    样例

    输入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("
    ");
    
        }
        return 0;
    }
    

    个人主页:

    www.codeapes.cn

  • 相关阅读:
    Bootstrap按钮
    Bootstrap标签页
    Identity 使用的命名空间
    bootstrap复选框和单选按钮
    更改Identity用户信息
    SSM配置梳理
    敏捷软件开发 第十三章~第十七章
    敏捷软件开发 第七章、第八章、第九章
    敏捷软件开发 第六章 一次编程实践
    敏捷软件开发 一至五章
  • 原文地址:https://www.cnblogs.com/codeapes666/p/12093749.html
Copyright © 2020-2023  润新知