您的位置:首页 > 其它

单链表实现两个长整数相乘

2012-04-30 01:37 357 查看
#include<iostream.h>
#include<stdlib.h>
#include<string.h>

#define MAX 100
#define toInt(a) (*(a)-'0')

typedef struct Node
{
int val;
struct Node* next;
}pNode;

enum RET_STATUS
{
RET_ERROR,
RET_OK
};

/**
*判断字符串合法性
*/
int isValid(char *p)
{
if(NULL == p || '\0' == *p)
{
return RET_ERROR;
}
if( '-' == *p || '+' == *p)
{
p++;
}
while('\0' != *p)
{
if('0' > *p || '9' < *p)
{
return RET_ERROR;
}
p++;
}

return RET_OK;
}

/**
*去掉长整数正负号和多余的0
*/
char* clearStr(char* str)
{
if('+' == *str || '-' == *str)
str++;
while('0' == *str)
{
str++;
}
return str;
}

/**
*设置相乘后的正负号
*/
pNode* setSign(pNode* head, char* str1, char* str2)
{
if((('-' == *str1)&&('-' != *str2)) || (('-' != *str1)&&('-' == *str2)))
{
head->val = -1;
}
return head;
}

/**
*将两个长整数相乘的结构存入单链表
*/
pNode* multiply(pNode* head, char* pStr1, char* pStr2)
{
int len1;
int len2;
int i;
int j;
int carry;			//进位标志
pNode* ptr = head;
pNode* pTemp;
head = setSign(head, pStr1, pStr2);

//先过滤掉符号和前面可能多余的0
pStr1 =	clearStr(pStr1);
pStr2 = clearStr(pStr2);
len1 = strlen(pStr1);
len2 = strlen(pStr2);

//首先每位相乘,不考虑进位
for(i = len1-1; i >= 0; i--)
{
ptr = head;
//找到指针前一个位置
for(j = 1; j < len1 - i; j++)
{
ptr = ptr->next;
}
for(j = len2-1; j >= 0; j--)
{
if(NULL == ptr->next)
{
pTemp = (pNode*)malloc(sizeof(pNode));
if(NULL == pTemp)
{
return NULL;
}
pTemp->next = NULL;
pTemp->val = 0;
ptr->next =pTemp;
}
ptr = ptr->next;
ptr->val += toInt(pStr1+i)*toInt(pStr2+j);
}
}
//循环进位
ptr = head;
carry = 0;
while(NULL != ptr->next)
{
ptr = ptr->next;
ptr->val +=  carry;		//先考虑前一次进位
carry = ptr->val/10;	//再设置下一次进位
ptr->val %= 10;			//最后赋余10之后的值
}
//处理最后一次进位
if(0 != carry)
{
pTemp = (pNode*)malloc(sizeof(pNode));
if(NULL == pTemp)
{
return NULL;
}
pTemp->next = NULL;
pTemp->val = carry;
ptr->next =pTemp;
}
return head;
}

/**
*采用递归方法,打印单链表表示的长整数
*/
void print(pNode* head)
{
if(NULL != head->next)
{
print(head->next);
}
cout<<head->val;
}

/**
*释放空间
*/
void release(pNode* head)
{
pNode* ptr = head;
pNode* ptr1;
while(NULL != ptr)
{
ptr1 = ptr->next;
free(ptr);
ptr = ptr1;
}
}

int main()
{
pNode * head;
char str1[MAX];
char str2[MAX];
cout<<"请输入两个长整数:"<<endl;
cin>>str1>>str2;

//对两个相乘数的合法性进行判断
while(!isValid(str1) || !isValid(str2))
{
cout<<"输入长整数不合法,请重新输入!"<<endl;
cin>>str1>>str2;
}

//初始化单链表
head = (pNode*)malloc(sizeof(pNode));
if( NULL == head)
{
cout<<"Error when initing!"<<endl;
return 0;
}
head->val = 1; //头结点正负标志,1为正,-1为负
head->next = NULL;

//采用单链表实现长整数相乘
head = multiply(head, str1, str2);
if(NULL == head)
{
cout<<"内存分配出错!"<<endl;
return 0;
}

//输出单链表表示的长整数
if( -1 == head->val)
{
cout<<"-";
}
if(NULL != head->next)
{
print(head->next);
cout<<endl;
}

//释放内存空间
release(head);
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: