zoukankan      html  css  js  c++  java
  • 大数乘法(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

  • 相关阅读:
    C#多线程学习(四) 多线程的自动管理(线程池)
    CHR6dm 校准软件下载
    WinAPI打开串口失败
    AHRS(航姿参考系统)和IMU(惯性测量单元)的区别【转】
    课程1:开始Direct3D
    CHR6dm datasheet 中文翻译
    从D3D将画面渲染至桌面
    Hello GPU
    linux配置java环境变量(详细)
    java中的多线程
  • 原文地址:https://www.cnblogs.com/codeapes666/p/12093749.html
Copyright © 2011-2022 走看看