大数乘法运算

做算法题时实现的一份大数乘法运算代码。没来得及详细整理,读者可以参考一下。

代码可以在VS2005上直接运行。

#include "stdafx.h"

#include <stdio.h>

#include <string>

#include <iostream>



using namespace std;

#define OK     0

#define ERROR -1



/* 函数声明 */

void calc1(char* pcStrA, int iLenA, int* piTmp, int num); 

void accumulate(int iIndex, int *piResult, int iLenResult, int *piTemp, int iLenTemp);

char* BignumMultiply(char* pcNumA,int iLenA,char* pcNumB,int iLenB,char* pcResult,int iLenResult); 



/*=============================================================== 

            调用calc1和accumulate函数计算大数相乘 

===============================================================*/

char* BignumMultiply

(

    char* pcNumA,

    int iLenA,

    char* pcNumB,

    int iLenB,

    char* pcResult,

    int iLenResult

) 

{ 

    int i     = 0;

    int j     = 0;

    int num   = 0;

    int index = 0;

    int *piTmp    = NULL;

    int *piResult = NULL;

    

    /* 分配临时结果的存放空间 */ 

    piTmp=(int*)malloc((iLenA+1)*sizeof(int)); 

    piResult=(int*)malloc(iLenResult*sizeof(int)); 

    memset(piTmp, 0, (iLenA+1)*sizeof(int));

    memset(piResult, 0, iLenResult*sizeof(int));



    for (i = iLenB - 1; i>=0; i--)

    { 

        /* 获取乘数pcNumB中第i位的值 */

        num = pcNumB[i] - '0'; 

        

        /* 计算被乘数与第i位的乘积,结果保存在piTmp整型数组中 */ 

        calc1(pcNumA,iLenA,piTmp,num); 

        

        /* 将piTmp数组中的值加到piResult数组中 */

        index++;

        accumulate(index,piResult,iLenResult,piTmp,iLenA+1); 

    } 

    //printf("\n%s\n", pcResult);



    /* 去掉piResult中第一个非零数字前的零 */

    i = 0;

    while (piResult[i++]==0); 

    

    /* 将整形数组piResult中的值转化成字符串存入pcResult中 */ 

    index = 0; 

    for (j = i - 1; j < iLenResult; j++, index++)

        pcResult[index] = piResult[j] + '0';

    if (iLenResult == i - 1)

    {

        pcResult[1] = '\0'; 

    }

    else

    {

        pcResult[index] = '\0'; 

    }

    

    free(piTmp); 

    free(piResult); 

    return pcResult;

} 



/*===============================================================

                计算被乘数与乘数的某一位的乘积 

===============================================================*/ 

void calc1

(

    char *pcStrA, 

    int iLenA, 

    int *piTmp, 

    int num

) 

{ 

    /* d两个位的乘积结果,remainder余数,carry进位 */ 

    int i         = 0;

    int result    = 0;

    int remainder = 0;

    int carry     = 0; 

    

    /* 从被乘数字符串'\0'的前一位算起 */ 

    for (i = iLenA - 1; i >= 0; i--) 

    { 

        result = pcStrA[i] - '0';

        result *= num; 

        remainder = (result + carry) % 10;

        carry = (result + carry) / 10; 

        piTmp[i+1] = remainder; 

    } 

    if (carry) 

        piTmp[0] = carry;

    else 

        piTmp[0] = 0; 

} 



/*=============================================================== 

将被乘数与乘数中一位数字的乘积结果计入res数组中 

==============================================================*/ 

void accumulate

(

    int iIndex,

    int *piResult,

    int iLenResult,

    int *piTemp,

    int iLenTemp

) 

{ 

    int i = 0;

    int j = 0;

    int m = 0;

    int n = 0;

    int remainder = 0;    //余数

    static int carry=0; 

    for (j = iLenTemp - 1, i = 0; j >= 0; j--, i++) 

    { 

        m = piTemp[j]; 

        n = piResult[iLenResult-iIndex-i]; 

        if (m + n + carry >= 10)

        { 

            remainder = (m + n + carry) % 10; 

            carry = 1;

        }

        else 

        { 

            remainder = m + n +carry; 

            carry = 0; 

        }

        piResult[iLenResult - iIndex - i] = remainder; 

    } 

}





/*****************************************************************************

 Prototype    : multiply

 Description  : 两个任意长度的长整数相乘, 输出结果

 Input Param  : 

                const std::string strMultiplierA  乘数A

                const std::string strMultiplierB  乘数B

 Output       : 

                std::string strRst            乘法结果

 Return Value : 

                int                       0  正确  

                                         -1  异常

*****************************************************************************/

int multiply (const std::string strMultiplierA,const std::string strMultiplierB, std::string &strRst) 

{

    int i = 0;

    int j = 0;

    int lenA = 0;

    int lenB = 0;

    int lenResult = 0;

    char *pcNumA = NULL; 

    char *pcNumB = NULL;

    char *pcResult = NULL; /* 计算两个字符串的长度,及存储结果所需要的空间 */ 



    lenA = (int)strMultiplierA.length();

    lenB = (int)strMultiplierB.length(); 

    if (0 == lenA || 0 == lenB)

    {

        return ERROR;

    }



    pcNumA = (char*)strMultiplierA.c_str();

    pcNumB = (char*)strMultiplierB.c_str();

    lenResult = lenA + lenB + 1; /* 分配并初始化字符串数组 */

    pcResult = (char*)malloc(lenResult * sizeof(char)); 

    memset(pcResult, 0, lenResult);

    for (i = 0; i < lenResult-1; i++) 

        *(pcResult + i) = '0'; /* 计算并输出计算结果 */



    //printf("The result is: %s",BignumMultiply(pcNumA,lenA,pcNumB,lenB,pcResult,lenResult));

    BignumMultiply(pcNumA,lenA,pcNumB,lenB,pcResult,lenResult);

    for (i = 0; i < (int)strlen(pcResult); i++)

    {

        strRst += pcResult[i];

    }

    //printf("\n%s\n", pcResult);

    free(pcResult);

    return OK;

}



int main(void)

{

    string str1 = "111111";

    string str2 = "222222";

    string str3;

    multiply(str1, str2, str3);

    cout << str1 << " * " << str2 << " = ";

    cout << str3 << endl;

    return 0;

}

 

你可能感兴趣的:(运算)