思路比较简单但是编写程序特别容易出错,思路就是用字符串来模拟乘法的计算,错误的地方在于,字符串的低位恰恰是其代表的长整数的高位
测试用例
#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;
}