65,211
社区成员
发帖
与我相关
我的任务
分享
//乘法处理
MaxValue multiply(MaxValue value1,MaxValue value2)
{
//相乘用多个相加来解决
MaxValue result,pTempResult;
//构造一个值为1的maxvalue
MaxValue pDel1 = new BitofMaxValue;
pDel1->data = '1';
pDel1->pNext = NULL;
pDel1->iSize = 1;
pDel1->pTail = pDel1;
pDel1->pPre = NULL;
MaxValue pAdd0 = new BitofMaxValue;
pAdd0->data = '0';
pAdd0->pNext = NULL;
pAdd0->iSize = 1;
pAdd0->pTail = pDel1;
pAdd0->pPre = NULL;
pTempResult = Del(value2,pDel1);
result = add(value1,pAdd0);
while (pTempResult->iSize >0)
{
if (pTempResult->iSize == 1)
{
if (NULL!= pTempResult)
{
if ('0'== pTempResult->data)
{
break;
}
}
}
MaxValue pDelete = result;
result = add(value1,result);
maxDelete(pDelete);pDelete = NULL;
pDelete = pTempResult;
pTempResult = Del(pTempResult,pDel1);
maxDelete(pDelete);pDelete = NULL;
}
return result;
}
void changeStrToMax(char* pStr,MaxValue& value)
{//例如 -123456 那么链表存储顺序为第一项6->5>4..>-
int iLen = (int)strlen(pStr);
for (int i = iLen-1;i >= 0; i--)
{
AddNode(value,pStr[i]);
}
}
void print(MaxValue value)
{
MaxValue pValue = value->pTail;
while (NULL!=pValue)
{
printf("%c",pValue->data);
pValue = pValue->pPre;
}
printf("\n");
}
void maxDelete(MaxValue value)
{
BitofMaxValue * pTemp = value->pTail;
while (true)
{
value->pTail = pTemp->pPre;
if (value->pTail)
{
delete pTemp;
pTemp = value->pTail;
}
else //最后一个元素
{
delete pTemp;
break;
}
}
}
//减法处理
MaxValue Del(MaxValue value1,MaxValue value2)
{
MaxValue result = NULL;
MaxValue pResult=result;
//p1Cur指向较大值
MaxValue p1Cur,p2Cur;
if ( value1->iSize > value2->iSize )
{
p1Cur = value1;
p2Cur = value2;
}
else if (value1->iSize < value2->iSize)
{
p1Cur = value2;
p2Cur = value1;
}
else if ( value1->pTail->data > value2->pTail->data )
{
p1Cur = value1;
p2Cur = value2;
}
else if ( value1->pTail->data < value2->pTail->data)
{
p1Cur = value2;
p2Cur = value1;
}
else
{
p1Cur = value1;
p2Cur = value2;
}
bool bDown1 = false;
while (NULL!= p1Cur && NULL != p2Cur)
{
char temp[5];memset(temp,0,5);
int iDown1 =0;
if (bDown1)
{
iDown1 = 1;
}
else
{
iDown1 = 0;
}
unsigned int iTempResult=0;
if ( p1Cur->data >= (p2Cur->data+iDown1) )
{
iTempResult = (p1Cur->data-'0') - (p2Cur->data-'0') - iDown1;
bDown1 = false;
}
else
{
//判断是否可以借一位,目前应该不用判断,前面已经保证1为较大值 if(p1Cur->pNext->data>0 || NULL!= p1Cur->pNext->pNext)
iTempResult = 10+(p1Cur->data-'0') - (p2Cur->data-'0') - iDown1;
bDown1 = true;
}
itoa(iTempResult,temp,10);
AddNode(result,temp[0]);
p1Cur = p1Cur->pNext;
p2Cur = p2Cur->pNext;
}
if ( NULL!= p1Cur)
{
while (NULL != p1Cur)
{
if (bDown1)
{
if (0 < p1Cur->data)
{
AddNode(result,p1Cur->data-1);
bDown1=false;
}
else
{
AddNode(result,9);
bDown1 = true;
}
}
else
{
AddNode(result,p1Cur->data);
}
p1Cur = p1Cur->pNext;
}
}
return result;
}
void main(void)
{
while(true)
{
//begin init
flushall();
char value1[1024];
memset(value1,0,1024);
printf("请输入第一个操作数:");
scanf("%s",value1);
flushall();
char value2[1024];
memset(value2,0,1024);
printf("请输入第二个操作数:");
scanf("%s",value2);
flushall();
char oper = 0;
printf("请输入操作符:");
scanf("%c",&oper);
//end init
MaxValue maxvalue1=NULL,maxvalue2=NULL, result=NULL;
changeStrToMax(value1,maxvalue1);
changeStrToMax(value2,maxvalue2);
if ('+' == oper)
{
result = add(maxvalue1,maxvalue2);
}
else if('-' == oper)
{
result = Del(maxvalue1,maxvalue2);
}
else if ('*' == oper)
{
result = multiply(maxvalue1,maxvalue2);
}
print(result);
printf("\n");
maxDelete(maxvalue1);
maxDelete(maxvalue2);
maxDelete(result);
}
}
//为链表增加一项
void AddNode(MaxValue & value,unsigned char nodeValue)
{
if (NULL == value)
{
value = new BitofMaxValue;
value->data = nodeValue;
value->pNext = NULL;
value->pPre =NULL;
value->pTail = value;
value->iSize = 1;
}
else
{
value->pTail->pNext = new BitofMaxValue;
value->pTail->pNext->data = nodeValue;//赋值
value->pTail->pNext->pNext = NULL;
value->pTail->pNext->pPre = value->pTail;
value->pTail = value->pTail->pNext;//结尾指针指向新增点
value->iSize++;//value增加一位
}
}
//加法处理
MaxValue add(MaxValue value1,MaxValue value2)
{
MaxValue result = NULL;
MaxValue p1Cur=value1,p2Cur=value2,pResult=result;
bool bUp1 = false;
while (NULL!= p1Cur && NULL != p2Cur)
{
char temp[5];memset(temp,0,5);
unsigned int iTempResult = p1Cur->data-'0'+p2Cur->data-'0';
if (bUp1)
{
iTempResult+=1;
}
if ( 9 < iTempResult )//说明有进位情况
{
bUp1 = true;
itoa(iTempResult - 10,temp,10);
AddNode(result,temp[0]);
}
else
{
bUp1 = false;
itoa(iTempResult,temp,10);
AddNode(result,temp[0]);
}
p1Cur = p1Cur->pNext;
p2Cur = p2Cur->pNext;
}
if ( NULL!= p1Cur)
{
while (NULL != p1Cur)
{
if (bUp1)
{
AddNode(result,p1Cur->data+1);
bUp1 = false;
}
else
{
AddNode(result,p1Cur->data);
}
p1Cur = p1Cur->pNext;
}
}
if ( NULL!= p2Cur)
{
while (NULL != p2Cur)
{
if (bUp1)
{
AddNode(result,p2Cur->data+1);
bUp1 = false;
}
else
{
AddNode(result,p2Cur->data);
}
p2Cur = p2Cur->pNext;
}
}
if (NULL == p1Cur && NULL == p2Cur && bUp1)
{
AddNode(result,'1');
}
return result;
}
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
#include <stdio.h>
#include <math.h>
typedef struct maxvalue //从低位开始以链表形式记录字符串表示的超大数
{
unsigned char data;
maxvalue* pNext;
maxvalue* pPre;
maxvalue* pTail;
int iSize;
}BitofMaxValue,* MaxValue;
void AddNode(MaxValue& value,unsigned char nodeValue);
MaxValue add(MaxValue value1,MaxValue value2);MaxValue Del(MaxValue value1,MaxValue value2);
MaxValue multiply(MaxValue value1,MaxValue value2);
void changeStrToMax(char* pStr,MaxValue& value);
void print(MaxValue value);
void maxDelete(MaxValue value);