利用双向循环链表实现任意长的整数进行加法运算
来源:互联网 发布:淘宝图片上传后变小 编辑:程序博客网 时间:2024/05/04 10:34
【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序 。
【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整形变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【测试数据】
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。
(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”。
加法运算分为同号和异号两部分,具体实现代码如下:
#include "stdio.h"#include "stdlib.h"#include "conio.h"#include "ctype.h"typedef struct DualNode{ int data; struct DualNode *prior, *next;}DualNode, *DualList;DualList InitList(int sign){ //头结点存放符号位,1为正,-1为负 DualList L; L = (DualList)malloc(sizeof(DualNode)); L->next = L->prior = L; L->data = sign; return L;}void InsertNodeAtTail(DualList L, int data){ //尾插,用于存储数据的输入 DualNode *s; s = (DualList)malloc(sizeof(DualNode)); s->data = data; s->next = L; s->prior = L->prior; L->prior->next = s; L->prior = s;}void InsertNodeAtHead(DualList L, int data){ // 即插在头结点之后,用于计算结果的存储 DualNode *s; s = (DualList)malloc(sizeof(DualNode)); s->data = data; s->next = L->next; s->prior = L; L->next->prior = s; L->next = s;}void PrintList(DualList L){ //打印结果 int FirstTime = 1; DualNode *p = L; if (p->data == -1) printf("-"); p = p->next; while(p != L) { if (FirstTime) { FirstTime = 0; printf("%d", p->data); } else { printf(",%4d", p->data); } p = p->next; } printf("\n");}DualList InputData(){ int FirstNum = 1, data; char c; DualList L; L = (DualList)malloc(sizeof(DualNode)); L->next = L->prior = L; printf("Please Input as Format: -1234,1234,1234\n"); if ((c = getchar()) == '-') L = InitList(-1); else L = InitList(1); if (isdigit(c)) // 退格处理 ungetc(c, stdin); do{ scanf("%d", &data); InsertNodeAtTail(L, data); }while((c = getchar()) != '\n'); printf("Your Input is:\n"); PrintList(L); return L;}void DelNode(DualList L, DualNode *p){ p->prior->next = p->next; p->next->prior = p->prior; free(p);}void Add(DualList a, DualList b, DualList c){ DualList pa, pb; int carry = 0, tmp; pa = a->prior; pb = b->prior; while((pa != a) && (pb != b)) { tmp = pa->data + pb->data + carry; if (tmp >= 10000) { carry = 1; tmp -= 10000; }else carry = 0; InsertNodeAtHead(c, tmp); pa = pa->prior; pb = pb->prior; } while(pa != a) { // pb = b tmp = pa->data + carry; if (tmp >= 1000) { carry = 1; tmp -= 10000; } else carry = 0; InsertNodeAtHead(c, tmp); pa = pa->prior; } while(pb != b) { // pa = a tmp = pb->data + carry; if (tmp >= 1000) { carry = 1; tmp -= 10000; } else carry = 0; InsertNodeAtHead(c, tmp); pb = pb->prior; } if (carry != 0) InsertNodeAtHead(c, 1);}void Sub(DualList a, DualList b, DualList c){ DualList pa, pb, pc; int borrow = 0,tmp; pa = a->prior; pb = b->prior; while((pa != a) && (pb != b)) { if (pa->data >= pb->data + borrow) { tmp = pa->data - pb->data - borrow; borrow = 0;; } else { tmp = 10000 + pa->data - pb->data - borrow; borrow = 1; } InsertNodeAtHead(c, tmp); pa = pa->prior; pb = pb->prior; } if (pa != a || (pa == a && pb == b && borrow == 0)) { // a >= b c->data = a->data; } if (c->data != a->data) { // a < b pc = c->prior; while(pc != c) { // 结果转换 if (pc == c->prior) pc->data = 10000 - pc->data; else pc->data = 9999 - pc->data; pc = pc->prior; } // 因为符号判断错误,所以borrow要取反 borrow = borrow?0:1; while(pb != b) { if (pb->data >= borrow) { tmp = pb->data - borrow; borrow = 0; } // 继续借位 else { tmp = 10000 + pb->data + borrow; borrow = 1; } InsertNodeAtHead(c, tmp); pb = pb -> prior; } } else{ // a>b while(pa != a) { if (pa->data >= borrow) { tmp = pa->data - borrow; borrow = 0; } else { tmp = 10000 - pa->data - borrow; borrow = 1; } InsertNodeAtHead(c, tmp); pa = pa->prior; } } pc = c->next; while(pc->next !=c && pc->data == 0) { pc = pc->next; DelNode(c, pc->prior); }}DualList AddList(DualList a, DualList b){ DualList c; if (a->data * b->data > 0) { c = InitList(a->data); Add(a, b, c); }else { c=InitList(b->data); Sub(a, b, c); } return c;}int main(int argc, char const *argv[]){ while(1) { //便于测试 DualList a, b, c; a = InputData(); b = InputData(); c = AddList(a, b); printf("The result is:"); PrintList(c); } return 0;}
阅读全文
0 0
- 利用双向循环链表实现任意长的整数进行加法运算
- 实现任意长的整数进行加法运算的演示程序
- 任意长的整数加法运算
- 双向链表实现长整数运算
- 任意长整数加法运算(C++)实验文档
- 利用位运算实现两个整数的加法运算
- VC++ 利用位运算实现两个整数的加法运算
- 利用位运算实现两个整数的加法运算
- 两个任意长度的长整数相乘(C语言、双向链表方法)
- 长整数四则运算_双向循环链表
- 实现任意两个整数的加法
- 链表实现任意精度整数运算
- 有链表实现长整数的加法
- 利用位运算实现两个整数的加法运算,请代码实现,并作简要说明。
- 利用 双向循环链表 实现通讯录的功能
- 双向循环链表长整数加法(大数加减法)
- 整数的加法运算
- Java程序练习-长整数加法运算
- java基础多目运算符是什么
- 常用工具汇总
- Linux 基础操作(三)————vim进阶使用、输出及管理输出、管道、建立用户或用户组
- ubuntu 14.04 安装 samba
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.transaction.spi.TransactionContext
- 利用双向循环链表实现任意长的整数进行加法运算
- POJ2886 Who Gets the Most Candies? 线段树+预处理
- xcode的多版本管理
- JetBrains全家桶(IDE)激活
- EditText的所有属性
- 在MAC上安装docker并部署oracle12.2
- WEB篇三 JS
- 在mac上安装postgres数据库
- Python字符串详解