**
题目如下
**
设计算法,实现一个任意长的整数进行加法、减法运算的演示程序。例如:1234,5123,4512,3451,2345与-1111,1111,1111,1111,1111的加法结果为:0123,4012,3401,2340,1234。基本要求如下:
(1) 利用链表实现长整数的存储,每个节点含一个整型变量;
(2) 整型变量的范围:-(2^15 -1)~(2^15 -1);
(3) 输入与输出形式每四位一组,组间用逗号分隔开。如:1986,8213,1935,2736,3299;
(4) 界面友好,每步给出适当的操作提示,并且系统具有一定的容错能力。
至少给出下面的测试数据:
(1)0; 0
(2)-2345,6789; -7654,3211
(3)-9999,9999; 1,0000,0000,0000
(4)1,0001,0001; -1,0001,0001
(5)1,0001,0001; -1,0001,0000
(6)-9999,9999,9999; -9999,9999,9999
(7)1,0000,9999,9999; 1
**
C++代码如下
**
#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(",%04d", 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("请按形式输入数据,例: -1111,1111,1111\n");
fflush(stdin);//清除键盘缓冲区
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("输入的数据是:\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 >= 10000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
while(pb!= b)
{
// pa = a
tmp = pb->data + carry;
if (tmp >= 10000)
{
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);
}
if(c->next->data==0)
c->data=1;
return c;
}
DualList SubList(DualList a, DualList b)
{
DualList c;
if (a->data * b->data > 0)
{
if((a->data==-1)&&(b->data==-1))
{
b->data=1;
c=InitList(b->data);
Sub(a, b, c);
}
else
{
b->data=1;
c=InitList(b->data);
Sub(a,b,c);
}
}
else
{
c=InitList(b->data);
Add(a, b, c);
if((a->data==1)&&(b->data==-1))
c->data=1;
else c->data=-1;
}
if(c->next->data==0)
c->data=1;
return c;
}
int main()
{
char sign;
DualList a, b, c;
do{
printf("输入+号,进行加法运算\n");
printf("输入-号,进行减法运算\n");
printf("输入字母x,退出程序\n");
scanf("%s",&sign);
switch(sign)
{
case'+':
a = InputData();
b = InputData();
c = AddList(a, b);
printf("相加之后的结果是:\n");
PrintList(c);
printf("\n");
break;
case'-':
a = InputData();
b = InputData();
c = SubList(a, b);
printf("相减之后的结果是:\n");
PrintList(c);
printf("\n");
break;
case'x':
break;
case'X':
break;
default:
printf("选择错误,请重新选择\n");
}
}while(sign!='x'&&sign!='X');
printf("程序已退出\n");
return 0;
}
**
程序运行结果截图如下
**