双向链表实现长整数运算
来源:互联网 发布:金域名邸 编辑:程序博客网 时间:2024/05/18 15:05
*问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
*基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~ (2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
*测试数据:
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“999
(4)1,0001,0001;-1,0001,0001;应输出“0”。
(5)1,0001,0001;-1,0001,0000;应输出“1”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“1,9999,9999,9998”。
*基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~ (2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
*测试数据:
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“999
(4)1,0001,0001;-1,0001,0001;应输出“0”。
(5)1,0001,0001;-1,0001,0000;应输出“1”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“1,9999,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
帮朋友写的,略挫。。凑合看吧。。
再次重申VC6是渣中之渣,谁用谁挂东南枝。
#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <vector>#include <string>#include <queue>#include <stack>#include <cmath>#include <set>#include <map>using namespace std;typedef int DataType;#define mem(a, n) memset(a, n, sizeof(a))#define ALL(v) v.begin(), v.end()#define si(a) scanf("%d", &a)#define sii(a, b) scanf("%d%d", &a, &b)#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)#define pb push_back#define eps 1e-8const int Base = 10000, inf = 0x3f3f3f3f, N = 10000 + 5;int T, cas = 0;int n, m;typedef struct DoubleNode { DataType data; struct DoubleNode *prior; struct DoubleNode *next;}DLNode;void InitNode(DLNode **head) { if((*head = (DLNode*)malloc(sizeof(DLNode))) == NULL) exit(1); (*head)->prior = NULL; (*head)->next = NULL;}void DestroyNode(DLNode **head) { DLNode *p, *tmp; p = (*head)->next; while(p != NULL) { tmp = p; p = p->next; free(tmp); } free(p); head = NULL;}// insert xbool InsertNode(DLNode *head, DataType x) { DLNode *pNode, *newNode; int cnt = 0; if(head == NULL) { puts("插入错误"); return false; } pNode = head; while(pNode->next != NULL) pNode = pNode->next; if((newNode = (DLNode *)malloc(sizeof(DLNode))) == NULL) exit(1); newNode->data = x; newNode->prior = pNode; newNode->next = NULL; pNode->next = newNode; return true;}void InsertNodePre(DLNode **head, DataType x) { DLNode *pNode = (DLNode *)malloc(sizeof(DLNode)); pNode->data = x; pNode->next = (*head); pNode->prior = NULL; (*head)->prior = pNode; (*head) = pNode;}int Digit(int x) { int cnt = 0; while(x) { x /= 10; cnt ++; } return cnt;}void PrintNode(DLNode *head) { DLNode *p = head->next; if(head->data < 0) printf("-"); while(p->data == 0 && p->next != NULL) p = p->next; printf("%d", p->data); p = p->next; while(p != NULL) { putchar(','); printf("%04d", p->data); p = p->next; } puts("");}int Compare(DLNode *a, DLNode *b) { int len1 = abs(a->data), len2 = abs(b->data); if(len1 > len2) return 1; else if(len2 > len1) return -1; else { DLNode *p1 = a, *p2 = b; while(p1->next != NULL) { p1 = p1->next, p2 = p2->next; if(p1->data == p2->data) continue; if(p1->data > p2->data) return 1; else return -1; } } return 0;}DLNode* add(DLNode *a, DLNode *b) { DLNode *p1 = a, *p2 = b, *head; InitNode(&head); while(p1->next != NULL) p1 = p1->next; while(p2->next != NULL) p2 = p2->next; int carry = 0, cnt = 0; int len1 = abs(a->data), len2 = abs(b->data); for(int i = 0; i < len1 || i < len2; i ++) { int x = 0, y = 0, num = 0; if(p1->prior != NULL) { x = p1->data; p1 = p1->prior; } if(p2->prior != NULL) { y = p2->data; p2 = p2->prior; } num = x + y + carry; carry = num / Base; num %= Base; if(!cnt) { InitNode(&head); head->data = num; } else { InsertNodePre(&head, num); } cnt ++; } if(carry > 0) InsertNodePre(&head, carry); DLNode *pNode = (DLNode *)malloc(sizeof(DLNode)); pNode->next = head; pNode->prior = NULL; pNode->data = cnt; head->prior = pNode; return pNode;}DLNode* sub(DLNode *a, DLNode *b) { DLNode *p1 = a, *p2 = b, *head; InitNode(&head); while(p1->next != NULL) p1 = p1->next; while(p2->next != NULL) p2 = p2->next; int borrow = 0, cnt = 0, flag = 1; int len1 = abs(a->data), len2 = abs(b->data); for(int i = 0; i < len1 || i < len2; i ++) { int x = 0, y = 0, num = 0; if(p1->prior != NULL) { x = p1->data; p1 = p1->prior; } if(p2->prior != NULL) { y = p2->data; p2 = p2->prior; } num = x - y - borrow; borrow = 0; if(num < 0) { borrow = 1; num = (num + Base) % Base; } if(!cnt) { head->data = num; } else { InsertNodePre(&head, num); } cnt ++; } DLNode *pNode = (DLNode *)malloc(sizeof(DLNode)); pNode->next = head; pNode->prior = NULL; pNode->data = cnt; head->prior = pNode; return pNode;}void Addition(DLNode *a, DLNode *b) { int len1 = abs(a->data), len2 = abs(b->data); int f1 = 1, f2 = 1, flag; DLNode *newNode = (DLNode *)malloc(sizeof(DLNode)); if(a->data < 0) f1 = -1; if(b->data < 0) f2 = -1; if(f1 * f2 > 0) { newNode = add(a, b); flag = f1; } else { int ret = Compare(a, b); if(ret > 0) { flag = a->data; newNode = sub(a, b); } else if(ret < 0){ flag = b->data; newNode = sub(b, a); } else { flag = 1; newNode = sub(a, b); } } newNode->data = flag; PrintNode(newNode);}void Subtraction(DLNode *a, DLNode *b) { int len1 = abs(a->data), len2 = abs(b->data); int f1 = 1, f2 = 1, flag; DLNode *newNode = (DLNode *)malloc(sizeof(DLNode)); if(a->data < 0) f1 = -1; if(b->data < 0) f2 = -1; if(f1 * f2 < 0) { newNode = sub(a, b); flag = f1; } else { int ret = Compare(a, b); if(ret > 0) { newNode = add(a, b); flag = f1; } else if(ret < 0){ newNode = add(b, a); flag = f2; } else { newNode = add(a, b); flag = 1; } } newNode->data = flag; PrintNode(newNode);}int InitNumber(DLNode *head, char *data) { int i = 0, x; head->data = 0; while(data[i] != ';') { x = 0; while(data[i] != ';' && data[i] != ',') { if(data[i] == '-') { i ++; continue; } x = x * 10 + data[i++] - '0'; } if(data[i] == ',') i ++; InsertNode(head, x); head->data ++; } if(data[0] == '-') head->data = -(int)(head->data); return i + 1;}int main(){#ifdef LOCAL freopen("/Users/apple/input.txt", "r", stdin); //freopen("/Users/apple/out.txt", "w", stdout);#endif char str[N]; puts("输入#退出"); while(1) { DLNode *Number1, *Number2; InitNode(&Number1), InitNode(&Number2); printf("输入数据:\n"); scanf("%s", str); if(str[0] == '#') break; int index = 0; index = InitNumber(Number1, str + index); index = InitNumber(Number2, str + index); Addition(Number1, Number2); DestroyNode(&Number1); DestroyNode(&Number2); } return 0;}
0 0
- 双向链表实现长整数运算
- 利用双向循环链表实现任意长的整数进行加法运算
- 长整数四则运算_双向循环链表
- 无限长整数运算
- 两个长数字串全乘双向链表实现
- 两个任意长度的长整数相乘(C语言、双向链表方法)
- 链表实现任意精度整数运算
- 用双向链表实现超长整数加减法
- 实现双向链表的创建、测长、打印、插入、删除
- Java程序练习-长整数加法运算
- 任意长的整数加法运算
- 无限长整数(加减乘运算)
- 实现任意长的整数进行加法运算的演示程序
- 实现长整数的相乘
- 整数运算实现四舍五入
- 算法导论10.2-8-用一个整数地址替代前后指针实现双向链表
- 实现双向链表
- 双向链表实现
- Android 中加密的String:让我们做出更少的失误
- Ubuntu PyQt5安装及部分错误解决方案
- 七步精通Python机器学习
- C++11之美
- 2015-12-14 程序员试题
- 双向链表实现长整数运算
- 《java多线程编程核心技术》之线程间通信
- java代码调用数据库的存储过程和函数 CallableStatement的用法
- reinterpret_cast<T>() static_cast<T>() const_cast<T>() dynamic_cast<T>()
- Spring中的国际化
- 不同APP通过SharedPreferences传递数据(共享数据)
- 搜索插入位置
- 你必须了解有关Babel 6的6件事
- 算法提高 学霸的迷宫 (题解)