C/C++大数乘法

最近接触C++语言,看到大数乘法的题,自己动手写一写,为日后有用做个笔记

其实基本思路还是和我们笔算的方法一致,只是笔算把相乘的结果都罗列出来(错位),然后再相加,考虑进位问题;在程序中我们直接在两个for循环中处理相乘结果相加的问题,再处理进位问题,最后考虑一点就是结果是0与开头可能是0的情况即可,同时注意对入参做合法性判断

觉得比较好的博客罗列如下:

【转】https://blog.csdn.net/u010155023/article/details/47422319

strlen(dataA) = 3
strlen(dataB) = 1
call calloc success!
call multiply success!
strResult:0
equal!
strlen(dataA) = 0
strlen(dataB) = 3
param wrong!
call multiply failed!
strResult:
equal!
strlen(dataA) = 3
strlen(dataB) = 3
call calloc success!
result:271272
strRst:271272
call multiply success!
strResult:271272
equal!
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

/*FUNC*/
int multiply(const std::string strMultiplierA, const std::string strMultiplierB, std::string& strRst)
{
    const char* dataA = strMultiplierA.c_str();
    const char* dataB = strMultiplierB.c_str();
    int dataALen = strlen(dataA);
    int dataBLen = strlen(dataB);
    std::cout << "strlen(dataA) = " << dataALen << std::endl;
    std::cout << "strlen(dataB) = " << dataBLen << std::endl;

    /*PARAM CHECK*/
    if((0 == dataALen) || (0 == dataBLen))
    {
        std::cout << "param wrong!" << std::endl;
        return (-1);
    }

    char result[100] = {'\0'};
    int* tempResult = (int*)calloc((dataALen + dataBLen), sizeof(int));
    if(NULL == tempResult)
    {
        std::cout << "call calloc failed!" << std::endl;
        return (-1);
    }
    std::cout << "call calloc success!" << std::endl;

    /*MULTIPLY*/
    int i = 0;
    int j = 0;
    for(i = 0; i < dataALen; i++)
    {
        for(j = 0; j < dataBLen; j++)
        {
            tempResult[i + j + 1] = tempResult[i + j + 1] + (dataA[i] - '0') * (dataB[j] - '0');
        }
    }

    /*PROCESS*/
    int k = 0;
    for(k = dataALen + dataBLen - 1; k >= 1; k--)
    {
        if(tempResult[k] >= 10)
        {
            tempResult[k - 1] = tempResult[k - 1] + tempResult[k] / 10;
            tempResult[k] = tempResult[k] % 10;
        }
    }

    /*ABANDON '0' IN THE HEAD*/
    for(i = 0; i < dataALen + dataBLen; i++)
    {
        if(tempResult[i] != 0)
        {
            break;
        }
    }
    if(i == (dataALen + dataBLen))
    {
        strRst = "0";
        free(tempResult);
        return (0);
    }

    j = 0;
    for(j = 0; i < dataALen + dataBLen; i++, j++)
    {
        result[j] = tempResult[i] + '0';
    }
    std::cout << "result:" << result << std::endl;
    strRst = result;
    std::cout << "strRst:" << strRst << std::endl;
    free(tempResult);
    return (0);
}

/*TEST FUNC*/
void TestCase01(void)
{
    int iRet = 0;
    std::string sExpectedResult("0");
    std::string strResult = "";

    iRet = multiply("003", "0", strResult);
    if(0 == iRet)
    {
        std::cout << "call multiply success!" << std::endl;
    }
    else
    {
        std::cout << "call multiply failed!" << std::endl;
    }
    std::cout << "strResult:" << strResult << std::endl;
    if(sExpectedResult == strResult)
    {
        std::cout << "equal!" << std::endl;
    }
    else
    {
        std::cout << "not equal!" << std::endl;
    }
    return;
}

void TestCase02(void)
{
    int iRet = 0;
    std::string sExpectedResult("");
    std::string strResult = "";

    iRet = multiply("", "004", strResult);
    if(0 == iRet)
    {
        std::cout << "call multiply success!" << std::endl;
    }
    else
    {
        std::cout << "call multiply failed!" << std::endl;
    }
    std::cout << "strResult:" << strResult << std::endl;
    if(sExpectedResult == strResult)
    {
        std::cout << "equal!" << std::endl;
    }
    else
    {
        std::cout << "not equal!" << std::endl;
    }
    return;
}

void TestCase03(void)
{
    int iRet = 0;
    std::string sExpectedResult("271272");
    std::string strResult = "";

    iRet = multiply("762", "356", strResult);
    if(0 == iRet)
    {
        std::cout << "call multiply success!" << std::endl;
    }
    else
    {
        std::cout << "call multiply failed!" << std::endl;
    }
    std::cout << "strResult:" << strResult << std::endl;
    if(sExpectedResult == strResult)
    {
        std::cout << "equal!" << std::endl;
    }
    else
    {
        std::cout << "not equal!" << std::endl;
    }
    return;
}

/*mainFunc*/
int main(void)
{
    TestCase01();
    TestCase02();
    TestCase03();
    return (0);
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值