[算法题] 大数乘法运算

简介:

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

代码可以在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;
}
复制代码

 

本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/3791120.html,如需转载请自行联系原作者
相关文章
|
7月前
|
算法 Java C++
试题 算法训练 集合运算
试题 算法训练 集合运算
43 1
|
7月前
|
算法
算法基础:高精度运算
算法基础:高精度运算
88 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
47 0
|
算法 搜索推荐 C++
【C++STL基础入门】vector运算和遍历、排序、乱序算法
【C++STL基础入门】vector运算和遍历、排序、乱序算法
258 0
|
存储 算法
【算法基础】高精度运算
【算法基础】高精度运算
59 0
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
4月前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
|
6月前
|
存储 算法 Python
技术心得记录:大整数算法【10】Comba乘法(实现)
技术心得记录:大整数算法【10】Comba乘法(实现)
37 0
|
6月前
|
算法 Java
Java数据结构与算法:位运算之与、或、异或运算
Java数据结构与算法:位运算之与、或、异或运算
|
6月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
65 0