长整数运算说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
do
{scanf("%s",&ch1);
if(ch1=='+'||ch1=='-')
{yunsuan(a,b,c,ch1);
OutputNumber(c,1);
break;
}
else
{printf("\n此版本不支持%c运算!是否重新输入运算符?(y/n):",ch1);
scanf("%s",&m);
2.本程序中,集合的元素限定为数字字符[‘0’~’9’]和字பைடு நூலகம்‘,’与‘;’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
3.现实长整数的分组存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
操作结果:将以head为头结点的链表中的所有数据输出到显示屏上。
void add(DLNode *head1,DLNode *head2,DLNode *head3)
操作结果:实现正数加正数的加法操作。
int change(DLNode *head1,DLNode *head2)
操作结果:判断存在俩个链表中的数的大小,如何head1中的数大于head2中的数那么返回值为0,反之返回值为1,相等时返回值为2。
if(m=='Y'||m=='y'){ n=2;printf("\n请输入运算符'-'或'+':");}
else break;
}
}
while(n=2);
printf("\n要继续新的运算吗?(y/n) : ");
scanf("%s",&ch);
if(ch=='Y'||ch=='y')
{ printf("\n");system("cls");
3.2
3.2.1
主要的作用是为用户做一个提示,如何完成自己想要的运算。同时调用各个函数实现运算。代码如下:
void main()
{ int n;
char ch,ch1,m;
while(1)
{DLNode *a,*b,*c;
ListInitiate(&a);
ListInitiate(&b);
ListInitiate(&c);
输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。
1.3
该设计要求设计程序,实现两个任意长的整数求和及差的运算问题。通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握线性表上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
typedef struct Node //双向链表的结构体定义
{int data;
struct Node *prior;
struct Node *next;
}DLNode;
3
由上面的提到的主程序、长整数运算、长整数输入输出、双向循环链表等几个主要模块,可得到程序运行图如下:
Y
N
图3.1主程序流程图
{DLNode *p,*s;
int j;
p=head->next;
j=0;
while(p!=head&&j<i){p=p->next;j++;}
if(j!=i){printf("\n插入位置不合法!");return 0;}
if((s=(DLNode *)malloc(sizeof(DLNode)))==NULL) exit(0);
摘要
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。而在一般的程序运算中,长整数是无法计算的,因为计算机一次能够运算的位数是有限,一旦整数很长,就需要一个程序来进行多次计算,通过长整数运算这个程序,可一把一个长整数分成多个普通整数来进行计算,使得长整数也可以进行运算。我编写的这个程序就可以进行长整数的加减运算,各个数据也可以是负数。
printf("\n---------------长整数运算--------------\n\n");
printf("请输入数A(以分号结束): ");
InputNumber(a);
printf("请输入数B(以分号结束): ");
InputNumber(b);
printf("请选择操作符:<+,->: ");
操作结果:将节点数据为x的节点插到第i个位置上去。
int abs(int x)
操作结果:绝对值函数,返回x的绝对值。
int InputNumber(DLNode *head)
操作结果:将从键盘中接收数据并把得到的数据存入以head为头结点的链表中。四位一存,中间以逗号区分,结束符为分号。
void OutputNumber(DLNode *head,int sign)
关键词:长整数;运算;加法;减法
Abstract
Data structure course design, students in the logical characteristics and physical data structure for the representation of the design, selection and application of data structure, algorithm and its realization, deepen the understanding of basic content of courses. At the same time, by the systematic and rigorous training in basic skills program design method and the operation and scientific style of work. But in the general program operation, long integers can not be calculated, because the computer time to operation number is limited, once the integer is long, need a program to calculate several times, operation of this program through the long integer, can put a long integer into a plurality of ordinary integers to calculate, the long integer can be calculated. This program I wrote to long integer addition and subtraction, all data can be negative.
详细要求:
(1)至少要用10组测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果;
(2)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;
(3)任何整型变量的范围是-(215-1)~(215-1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,例1,0000,00
Keywords:long integer;arithmetic; additive; subtraction
1
1.1
题目:长整数运算
内容:使用双向循环链表存储长整数,每个结点含一个整型变量,主要功能有:长整数输入(建立双向循环链表)、长整数的加法、长整数的减法及结果的显示输出等。
1.2
1.本程序实现计算任意长的整数的加法运算.以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
continue;
}
else exit(0):
}
}
3.2.2
已知一双向链表,在第i个位置插入data为x的节点。函数需要注意的是在什么位置插入才是合法的,在就是在该节点指针时的顺序不要搞错。代码如下:
int ListInsert(DLNode *head,int i,int x) //双向链表的数据插入,i表示是插入的第几个元素
为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用来存储数据,长整型用表示数据的运算。
利用双向循环链表来实现对长整数的存储。选择该数据结构来完成长整数的加减运算是因为要对长整数进行运算,需要对长整数进行存储,所以选择用链表对长整数存储,又由于存储的顺序是从左到右,而运算的顺序则是从右到左,这样位了操作方便选择循环链表,在运算过程中有进位和借位的操作,所以最终选择双向循环链表的数据结构。
2.2
该程序主要由以下几大模块组成:
1.主程序模块:主要实现对个模块的调用和界面的管理,提示用户,帮助用户快速准确的完成运算。
2.双向循环链表处理模块:实现对数据的存储、管理,主要由void ListInitiate、int ListLength等函数组成。
3.长整型数的输入输出模块:主要由void OutputNumber、int InputNumber等函数组成,实现数据的输入。
程序功能模块图如图2.1所示。
图2.1功能模块图
2.3
void ListInitiate(DLNode **head)
操作结果:初始化一个头结点为head的双向循环链表。
int ListLength(DLNode *head)
操作结果:计算以head为头结点的链表的长度。
int ListInsert(DLNode *head,int i,int x)
4.长整数运算模块:主要由void add、int change、int change等函数组成。也就是函数void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch)实现的是正数,负数,加法,减法。计算式共分为八种运算,在这之前我已经实现了二种运算,那么这个函数就是把这八种运算按照一定的规则转化成已经实现的二种运算来实现完整的加减法运算。
void minus(DLNode *head1,DLNode *head2,DLNode *head3)
操作结果:计算正数减正数的减法运算。
void main()
操作结果:主函数。调用以上的各个函数来引导用户进行长整数的加法运算,加法运算.。
2.4
本次课设所使用的数据结构双向循环链表的节点由三个部分组成,第一是数据部分data存储此节点的数据,第二是此节点的前驱指针部分*prior指向此节点的前驱,第三是此节点的后继指针部分*next指向此节点的后继。数据部分我们约定它为整形变量,前驱后继指针均为结构体Node类型。代码如下:
00,0000;而输入为1,0001,0001和-1,0001,0000实现加法时,应输出"1";
(4)较高要求:使程序在整型量范围是-(2n-1)~(2n-1)的计算机上都能有效地运行。其中,n是由程序读入的参量。
2
2.1
我们首先要考虑的是如何表示长整型数。按照传统习惯要求每4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。总之,为了实现上述功能,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。(3)对于每一个长整型数可以设置一个头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的4位数的组数。第一个存储4位数据组的结点称为首结点,而最后一个4位数据组结点称为尾结点。
相关文档
最新文档