单链表实现两个长整数相乘
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; }
相关文章推荐
- 链家笔试题--java实现两个大整数相乘的算法
- 实现两个大整数相乘
- JS实现两个大数(整数)相乘 实例代码
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
- JS实现两个大数(整数)相乘
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 关于两个长整数相乘的实现
- 不用判断性语句,实现求两个整数中较大数的函数
- 1、使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数
- C#学习 - vs调试(采用异常处理来实现两个整数的和)
- 求两个大整数相乘的积,数字长度在127个字符之内。
- 利用位操作符实现两个整数的交换
- 大数算法 -- 正整数相乘(Java 实现)
- [导入]不用判断性语句,实现求两个整数中较大数的函数
- 判断两个单链表是否相交--java实现
- leetcode 实现两个int整数相除(不用乘除,取余)
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加法运算
- 两个超大正整数相加问题之链表实现(代码惨不忍睹,慎进)