如题,解决大整数相乘:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
/*
详细描述:
char* LongIntegerMul(char* pNum1, char *pNum2);
输入参数:
char* pNum1:使用字符串表示的长整数1
char* pNum2:使用字符串表示的长整数2
输出参数(指针指向的内存区域保证有效):
无。
返回值:
char*:使用字符串表示结果整数,
内存动态申请内存保存结果,外部调用者释放。
*/
bool isLegal(const char *pInput)
{
//if(!pInput) return false;
int len = strlen(pInput);
//if(len == 0 ) return false;
for(int i = 0 ; i < len ; ++i)
{
if(i == 0)
{
continue;
}
else if((pInput[i] == '-' || pInput[i] == '+') && i != 0){
return false;
}
else if(pInput[i]< '0' || pInput[i] > '9' && i!=0 ){
return false;
}
}
return true;
}
bool get_sign(char *pNum)
{
if(!pNum) return false;
if(strlen(pNum) == 0 ) return false;
if(pNum[0] == '-') return false;
else return true;
}
int get_start(char *pInput)
{
//if(!pInput) return 0;
int len = strlen(pInput);
int start = 0;
while(start < len && (pInput[start] == '0' || pInput[start] =='-' || pInput[start] =='+')) ++start;
return start;
}
char* LongIntegerMul(char* pNum1, char *pNum2)
{
if(!pNum1||!pNum2 ||strlen(pNum1) == 0 || strlen(pNum2) ==0 )
{
char *pOut = (char*) malloc((2)*sizeof(char));
pOut[0] = '0';
pOut[1] = '\0';
return pOut;
}
if(!isLegal(pNum1) || !isLegal(pNum2))
{
return NULL;
}
int len1 = strlen(pNum1) , len2 = strlen(pNum2);
int start1 = get_start(pNum1) ,start2 =get_start(pNum2);
if(start1 == len1 || start2 == len2)
{
char *pOut = (char*) malloc((2)*sizeof(char));
pOut[0] = '0';
pOut[1] = '\0';
return pOut;
}
bool flag = get_sign(pNum1) == get_sign(pNum2) ? true:false;
int len = len1+len2;
int *tmp = (int *) malloc(len*sizeof(int));
memset(tmp, 0, (len) * sizeof(int));
if(!tmp) return NULL;
for( int i = start1 ; i < len1 ; ++i)
{
for(int j = start2 ; j < len2 ; ++j)
{
tmp[len-2-i-j] += (pNum1[i]-'0') *(pNum2[j]-'0');
}
}
int carry = 0 ;
for( int i = 0 ; i < len ; ++i)
{
tmp[i] += carry ;
carry = tmp[i] /10 ;
tmp[i] %= 10 ;
}
char *pOut = (char*) malloc((len1+len2+1)*sizeof(char));
memset(pOut, 0, (len1 + len2+1) * sizeof(char));
if(!pOut) return NULL;
int start = 0 ;
if(!flag) pOut[start++] = '-';
int i = len - 1;
while(tmp[i] == 0 ) i--;
for( ; i >= 0 ; --i)
{
pOut[start++] = tmp[i]+'0';
}
pOut[start] = '\0';
free(tmp);
tmp = NULL;
return pOut;
}