长整数的乘法

来源:互联网 发布:淘宝银泰意选海外旗舰 编辑:程序博客网 时间:2024/04/30 04:35

思路比较简单但是编写程序特别容易出错,思路就是用字符串来模拟乘法的计算,错误的地方在于,字符串的低位恰恰是其代表的长整数的高位

测试用例

#include <cppunit/config/SourcePrefix.h>
#include "CExampleTest.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

extern char* LongIntegerMul(char* pNum1, char *pNum2);

// 注册测试套到CppUnit
CPPUNIT_TEST_SUITE_REGISTRATION( CExampleTest );

// SetUp: 在每个用纈前执GG一次
void CExampleTest::setUp()
{
    return;
}

// tearDown: 在每个用纈后执GG一次
void CExampleTest::tearDown()
{
    return;
}


/* ----------用纈------------- */
void CExampleTest::TestCase01_1()
{
    char *num1 = "9312";
    char *num2 = "9999";
    char *result = NULL;
    char *expect = "93110688";
    
    result = LongIntegerMul(num1, num2);
    
    if(result)
    {
        CPPUNIT_ASSERT(0 == strcmp(result, expect));    
        free(result);
    }
    else
    {
        CPPUNIT_ASSERT(0);
    }
    return;
}

程序如下

#include <stdlib.h>

#include <string.h>
#include <stdio.h>

/*
详细描述:   
char* LongIntegerMul(char* pNum1, char *pNum2);
输入参数:
         char* pNum1:使用字符串表示的长整数1
         char* pNum2:使用字符串表示的长整数2
输出参数(指针指向的内存区域保证有效):
         无。
返回值:
        char*:使用字符串表示结果整数,
内存动态申请内存保存结果,外部调用者释放。
*/
#include <iostream>
using namespace std;

int mulChar(char a,char b)
{
    return (a-'0')*(b-'0');
}
char charPlus(char* str, int pos,int adder)
{
    int num=(str[pos]-'0'+adder);
    str[pos]='0'+(num%10);
    int carry=num/10;
    int pp=pos-1;
    while(carry>0)
    {
      
        
        int temp=str[pp]-'0'+carry; //获取pp位置处得新值
        carry=temp/10;
        str[pp]=(temp%10)+'0';// 此处应该是+=和+,而不是=和-;

        pp--; // 注意这里是--而不是++;
    }
    
    return ('0'+(num%10)); //此处的num已经不是原来的num了
            
}

char* LongIntegerMul(char* pNum1, char *pNum2)
{
    char* a=pNum1;
    char* b=pNum2;
    
    if(pNum1==NULL||pNum2==NULL) return NULL;
    
    int n2=strlen(pNum2); //是字符串中含有字符的个数,不含结束符号
    int n1=strlen(pNum1);
    
    char* str=new char[n1+n2+1];
    memset(str,'0',n1+n2);
    str[n1+n2]='\0';  //最后一个符号置为结束符号
    

    for(int i=0;i<n1;i++)
    {
        for(int j=0;j<n2;j++)
        {
            int pos=(n1+n2-1)-(i+j);  //pos的最大值是n1+n2-1而n1+n2那一位依靠进位得到
            int pos1=n1-1-i; // 真实数字的第i位
            int pos2=n2-1-j; //真实数字的第j位
            
            int res=mulChar(pNum1[pos1],pNum2[pos2]);
            int carry=res/10;
            
            str[pos]=charPlus(str,pos,(res%10)); //自加操作
            
            if(carry>0)
            {
                str[pos-1]=charPlus(str,pos-1,carry);   //注意这里是pos-1
            }

        }
    }
    return str;
}


0 0
原创粉丝点击