把JMX童鞋的大整数相乘问题发上来

如题,解决大整数相乘:

#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;
	
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值