两个任意长的整数的求和运算

两个任意长的整数的求和运算
两个任意长的整数的求和运算

两个任意长的整数的求和运算

进制的转换

2014 年6月

软件综合课程设计

目录

一、问题陈述

二、需求分析

三、概要设计

四、详细设计

五、程序代码

六、运行结果与测试

七、设计体会与总结

两个任意长的整数的求和运算

一、问题陈述

设计一个程序实现两个任意长的整数的求和运算。

利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。

二、需求分析

1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。

2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。

3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以#结束,每四位一组。

三、概要设计

在此说明数据结构设计和关键的算法设计思想

Add()函数是实现该问题的主要函数即相加。

typedef struct et 定义双循环链表的存储结构.

void setin(dtp *a) 读入数据存储在双链表中的函数;

void print1(dtp *w,int len) 原样输出输入的数,略去结束符"#";

void print2(dtp a,int len) 输出运算结果,以每四位一个","样式;

四、详细设计

程序流程图

五、程序代码

#include

using namespace std;

#define null 0

typedef struct et //自定义双循环链表的存储结构.

{

int data;

struct et * pr,* next;

} dtp;

void setin(dtp *a) //读入数据存储在双链表中的函数;

{

char k;

int w,len=0;

dtp *p;

a->next=null;

a->data=null;

a->pr=null;

cout<<"input the number: ";

while (cin>>k) //一次读入数字或一个字符",";

{

if(k=='\n')

continue;

if(k=='#')

break; //以"#"表示该数也讲读完;

if(k==44)

continue; //读到字符','继续读下一个数;

p=new dtp; //读入一个四位数为它开辟一个存储空间

w=k-'0';

p->data=w;

len++;

if(a->next)

a->next->pr=p;

p->next=a->next;

a->next=p;

p->pr=a;

k=0;

}

}

void add(dtp a,dtp b,dtp *c,int *len) //两个数相加的函数;

{

dtp *s,*r,*t;

int i,j,sum,k=0,w=0;

c->next=null;

c->data=null;

c->pr=null;

s=a.next;

r=b.next;

while(s&&r) //从最后一位开始加,若多于10,进到下一个存储空间;

{ //直到一个数被加完为止;

i=s->data;

j=r->data;

sum=i+j+k;

k=sum/10;

sum=sum%10;

t= new dtp;

t->data=sum;

w=w+1;

if(c->next)

c->next->pr=t;

t->next=c->next;

c->next=t;

t->pr=c;

s=s->next;

r=r->next;

}

if(s||r) //如果有一个数还有更高位,则继续加上去;

{

if(s)

while(s)

{

t= new dtp;

sum=s->data+k;

k=sum/10;

sum=sum%10;

t->data=sum;

w=w+1;

if(c->next)

c->next->pr=t;

t->next=c->next;

c->next=t;

t->pr=c;

s=s->next;

}

if(r)

while(r)

{

t= new dtp;

sum=r->data+k;

k=sum/10;

sum=sum%10;

t->data=sum;

w=w+1;

if(c->next)

c->next->pr=t;

t->next=c->next;

c->next=t;

t->pr=c;

r=r->next;

}

}

if(k!=0) //如果最后还有就要多开辟一个空间来存储.

{

t= new dtp;

t->data=k;

w=w+1;

if(c->next)

c->next->pr=t;

t->next=c->next;

c->next=t;

t->pr=c;

}

*len=w;

}

void print1(dtp *w,int len)//原样输出输入的数,略去结束符"#";

{

dtp *q;

int i=len;

q=w->next;

while (q->next)

{

q=q->next ;

}

while (q->pr)

{

cout<data;

q=q->pr;

i--;

if(i%4==0&&i)

cout<<",";

}

cout<

}

void print2(dtp a,int len)//输出运算结果,以每四位一个","样式;

{

int i=len;

dtp *q;

q=a.next;

while (q)

{

cout<data;

q=q->next;

i--;

if(i%4==0&&i)

cout<<",";

}

cout<

}

void main ()

{

int length;

char ma;

dtp la,lb,lc;

{

cout<<"输入方式,按从后面每四位之间一个字符','的形式.以'#'表示输入结束: "<

cout<<"请输入第一个数 a: "<

setin(&la);

cout<<"请输入第二个数 b: "<

setin(&lb);

add (la,lb,&lc,&length);

cout<<"你输入的两个数的和为: ";

cout<

print1 (&la,length);

cout<<"+ ";

print1 (&lb,length);

cout<<"---------------";

cout<

print2(lc,length);

for(;2;)

{

cin>>ma;

if (ma=='\n')

continue ;

else break;

}

}

}

六、运行结果与测试

进制的转换

一、问题陈述

任意给定一个M进制的数x ,请实现如下要求

1)求出此数x的10进制值(用MD表示)

2)实现对x向任意的一个非M进制的数的转换。

3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)。

二、需求分析

1、应用环境设定:

生活中我们需要将M进制的数转换为我们所需要的进制,从键盘任意输入一个M进制的数,对其进行转换成其他三种进制的数,然后再从电脑中显示出来,最终得到我们的结果。

2、用户界面:

命令行界面,根据自己的要求,对界面的提示进行操作,正确输入我们需要的数据。

3、输入方式:

首先输入将转换的进制数,回车确认;然后输入确定的数据,回车确认;接着选择要转换为的进制数,回车确认。

输出方式:

界面直接输出,启动程序后,按照界面提示,输入数据,直接回车确认,显示屏即输出我们的数据结果。

数据储存方式:

全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结束后不保存数据。

程序功能:

(1)、根据界面提示输入M进制数据。

(2)、对任意M进制数据实行非M进制的转换。

三、概要设计

在此说明数据结构设计和关键的算法设计思想

1、用数组实现该问题

D2M()函数和M2D()函数是实现该问题的主要函数。

D2M()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用D2M()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。

而M2D()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非M进制的数。

2、用栈实现该问题

同样是利用D2M()和M2D()两个函数实现。两个函数的思想同利用数组实现时相同。只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。(1)、SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;

(2)、int InitStack(SqStack &S)到int DestroyStack(SqStack &S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;

(3)、SqStack S是指定义栈S;

(4)、D2M(int a,int b)的功能是将十进制数转换成M进制的函数;

(5)、M2D()的功能是M进制转换为十进制的函数;

(6)、void main()是主函数。其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用D2M()函数和M2D()函数,而且实现M进制数向任意非M 进制数的转换。

四、详细设计

程序流程图

A.用数组实现(文件名shuzu.cpp)

#include

#include

#define N 1000

int i, j, y, n, s;

int m, r, reminder;

int x; //全局变量默认初始化为0,不必再赋0了

D2M(int g, int h) //十进制数转换为其他进制数

{

int c[N];

i = 0;

reminder = g % h;

g = g / h;

if (reminder > 9) {

c[i] = reminder + 55;

i++;

} else {

c[i] = reminder;

i++;

}

if (g > 0)

D2M(g, h);

for (j = i - 1; j >= 0; j--)

if (c[j] >= 65)

printf("%c", c[j]);

else

printf("%d", c[j]);

return 0;

}

M2D(int e) //二进制和八进制数转换为十进制数,并这转换为其他进制数

{

int a[N];

printf("请输入%d进制位数:\n", m);

scanf("%d", &n);

printf("请输入%d进制的每位并使每位用空格隔开:\n", m);

for (i = 0; i < n; i++)

scanf("%d", &a[i]);

for (i = n - 1; i >= 0; i--) {

y += (int) pow(e, j) * a[i]; //强制类型转换,以免造成数据丢失

j++;

}

printf("需要转换的进制M:\n");

scanf("%d", &s);

printf("请输出转换成%d进制的结果:\n", s);

D2M(y, s);

return 0;

}

H2D(int f) //十六进制数转换为十进制数,并转换为其他进制数

{

int b[N];

printf("请输入%d进制位数:\n", m);

scanf("%d", &n);

printf("请输入%d进制的每位并使每位用空格隔开:\n", m);

for (i = 0; i < n; i++)

scanf("%x", &b[i]);

for (i = n - 1; i >= 0; i--) {

y += (int) pow(f, j) * b[i]; //强制类型转换,以免造成数据丢失

j++;

}

printf("需要转换的进制M:\n");

scanf("%d", &s);

printf("请输出转换成%d进制的结果:\n", s);

D2M(y, s);

return 0;

}

int main()

{

printf("请给定一个需转换的进制M(2or8or10or16):\n");

scanf("%d", &m);

if (m == 2 || m == 8) //二进制和八进制转换成十进制

M2D(m);

else if (m == 16) //十六进制转换成十进制

H2D(m);

else if (m == 10) //十进制转换成其它进制

{

printf("请输入一个%d进制数:\n",m);

scanf("%d", &x);

printf("请输入需要转换成的进制M(2or8or16):\n");

scanf("%d", &r);

printf("请输出转换成%d进制的结果:\n",r);

D2M(x, r);

}

return 0;

}

B.用栈实现(文件名zhan.cpp)

#include

#include

#include

#include

#define STACK_INIT_SIZE 100 //存储空间初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

int e, m, x, s, t; //x为要转换的十进制数,e 为临时用的的int型变量int r, y, i, n;

typedef struct

{

int *base; //栈底

int *top; //栈顶

int stacksize; //栈容量

} SqStack;

int InitStack(SqStack &S)

{ //构造一个空栈

S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));

if(!S.base) exit(0); //存储空间失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return 0;

}

int GetTop(SqStack S, int &e)

{ //若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1 if(S.top==S.base) return 1;

e=*(S.top-1);

return 0;

}

int Push(SqStack &S , int e)

{ //插入元素e为新的栈顶元素

if(S.top-S.base>=S.stacksize)

{ //栈满,追加存储空间

S.base=(int *)realloc(S.base,

(S.stacksize+STACKINCREMENT)*sizeof(int));

if(!S.base) return 1; //存储分配失败

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

return 0;

}

int Pop(SqStack &S, int &e)

{ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1 if(S.top==S.base) return 1;

e=*--S.top;

return 0;

}

int StackEmpty(SqStack S)

{ //若栈空,则返回1,否则返回0

if (S.top == S.base)

return 1;

return 0;

}

int DestroyStack(SqStack &S)

{ //销毁栈S,栈S不再存在

free(S.base);

S.top=NULL; //防止程序后面不小心使用了它

S.base=S.top;

return 0;

}

SqStack S; //定义栈S

int D2M(int a, int b) //十进制转换成其他进制的函数D2M()

{

while (a)

{

r = a % b;

if (r > 9)

r = r + 55;

Push(S, r); //压入栈

a /= b; //转换成M进制

}

printf("该数转换成%d进制的结果:", b);

while (!StackEmpty(S))

{

Pop(S, e); //弹出栈

if (e >= 65)

printf("%c", e);

else

printf("%d", e);

}

return 0;

}

void M2D() //其他进制转换为十进制的函数M2D()

{

char c[1000];

printf("请输入需要转换的数的位数:");

scanf("%d", &n);

printf("请输入需要转换的数的每位并用空格隔开:");

for (i = 0; i < n; i++)

{

scanf("%x", &c[i]);

Push(S, c[i]);

}

i = 0;

while (!StackEmpty(S))

{

Pop(S, e);

y += (int) pow(m, i) * e;

i++;

}

}

int main()

{

InitStack(S); //构造一个空栈

printf("请输入需要转换的进制M(2or8or10or16):");

scanf("%d", &m);

if (m == 10) //十进制转换成其他进制

{

printf("请给定一个需要转换的10进制数:");

scanf("%d", &x);

printf("请输入需要转换成的进制数:");

scanf("%d", &t);

D2M(x, t);

}

if (m == 2 || m == 8 || m == 16) //其他进制转换成十进制,且其他任意进制的相互转换

{

M2D();

printf("给定要转换成的进制M:");

scanf("%d", &s);

D2M(y, s);

}

printf("\n");

DestroyStack(S); //销毁栈S,栈S不再存在}

六、运行结果与测试

1.十六进制数1A2B3C转换十进制数测试结果如下:

2.二进制数11001100转换八进制数测试结果如下:

3.八进制数1234转换为十六进制数测试结果如下:

七、设计体会与总结

这次的软件综合设计,刚开始设计的第一个我是根据老师说的要求,用了C++,这个是在大学的时候学的,但是学的不是特别好,后来又说可以用C语言,我就把第二个程序用了C语言,因为我对C了解的比较多,因为高中学过三年。

这次的软件综合设计使我收获颇丰,它结合了我们大学期间学习的C++语言、C语言和数据结构的相关知识,C是高中的时候学的,C++语言是大一学习的,而数据结构是大二学习的,因此这次的课程设计可谓是对以前学习的知识的一个复习和巩固,也正是这样,让我们更加熟悉和巩固已有的计算机知识,为我们今后计算机的学习奠定了坚实的道路。

本次的课程设计,我选的题目是两个任意长的整数的求和运算和进制的转换。以前也写过类似的,不过一般都是基于顺序表的,这次是用链表来作为我系统的数据存储结构。经过这两周的辛苦和努力,总算是实现了系统的大概的功能。对于数据的链式存储,动态的申请内存空间是必不可少的功能。因此在实验中我的最大的问题就是内存释放不干净,产生了一些野指针,使得程序的运行不稳定。后来通过反复的单步调试,我总算找到了相应的解决办法。

最后,感谢大学三年来为我们辛勤付出的老师们,感谢你们孜孜不倦的教诲。正是有了你们的教导,才有我们在计算机道路上的前行。

两个任意长的整数的求和运算

两个任意长的整数的求和运算 进制的转换 2014 年6月 软件综合课程设计

目录 一、问题陈述 二、需求分析 三、概要设计 四、详细设计 五、程序代码 六、运行结果与测试 七、设计体会与总结

两个任意长的整数的求和运算 一、问题陈述 设计一个程序实现两个任意长的整数的求和运算。 利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。 二、需求分析 1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。 2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。 3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以#结束,每四位一组。 三、概要设计 在此说明数据结构设计和关键的算法设计思想 Add()函数是实现该问题的主要函数即相加。 typedef struct et 定义双循环链表的存储结构. void setin(dtp *a) 读入数据存储在双链表中的函数; void print1(dtp *w,int len) 原样输出输入的数,略去结束符"#"; void print2(dtp a,int len) 输出运算结果,以每四位一个","样式; 四、详细设计 程序流程图

五、程序代码 #include using namespace std; #define null 0 typedef struct et //自定义双循环链表的存储结构.

长整数运算说明书汇编

摘要 数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。而在一般的程序运算中,长整数是无法计算的,因为计算机一次能够运算的位数是有限,一旦整数很长,就需要一个程序来进行多次计算,通过长整数运算这个程序,可一把一个长整数分成多个普通整数来进行计算,使得长整数也可以进行运算。我编写的这个程序就可以进行长整数的加减运算,各个数据也可以是负数。 关键词:长整数;运算;加法;减法

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. Keywords: long integer; arithmetic; additive; subtraction

第3课时 整数加法运算定律推广到小数(导学案)

第3课时整数加法运算定律推广到小数课题整数加法运算定律推广到小数课型新授课 设计说明 小数的简便运算是在学生已经学习了整数的运算定律和小数加减混合运算的基础上学习的。为了使学生直观地感知加法运算定律在小数的运算中同样适用,进一步体会运用这些定律能使计算简便,教学中从以下几点进行了设计: 1.创设情境,对比概括。 设计情境,让学生进一步了解、经历用加法运算定律进行简算的过程,理解整数的运算定律在小数运算中同样适用。采用对比的方式呈现出两位学生不同的计算思路,通过对比,使学生直观感知加法运算定律在小数运算中同样适用,并进一步体会用加法运算定律进行计算既简便,又快捷,使学生在以后的小数运算中能自觉地应用运算定律进行简算。 2.自主探究,合作交流。 《数学课程标准》中提到:“动手实践、自主探究、合作交流是学生学习数学的重要方式。”本节课让学生分组合作学习,给学生提供交流和表达的机会,多给学生自主学习的时间和空间。先学习运算定律,再进行实践练习,最后验证整数的运算定律在小数运算中同样适用。 3.边学边练,学以致用。 依据本节课的重难点,分散练习、边学边练,及时调整教学的状况,通过不同层次的练习,调动学生学习的积极性,体验数学的价值,同时充分发展学生的个性。 学习目标 1.理解整数加法的运算定律在小数加法中同样适用。 2.会运用运算定律和运算性质进行简便计算。 学习重点理解整数的运算定律在小数运算中同样适用。 学习难点能运用运算定律和性质灵活地进行简便运算。 学前准备 教具准备:多媒体课件 学具准备:口算卡 课时安排1课时 教学环节导案学案达标检测 一、复习旧知,导入新课。(5分钟)1.计算。 0.25+0.45=0.68-0.24= 7.4-6.8=3-0.75= 2.在○里填上适当的符号。 32+5○5+32 1.独立完成,汇报结果。 2.填写符号,说说运用了 哪些定律。 3.明确本节课的学习内 容。 1.在下面的□里填上适当的数, 在○里填上“+”或“-”。 (1)285+327=□+285 (2)926+82+18=926+(□○

任意长整数加法运算

课程名称: 《数据结构》课程设计 课程设计题目: 任意长整数加法运算 姓名: XXX 专业: 计算机科技2班年级: 13级学号: E11314XXX 指导老师:XXX 2015年9月17 目录 1.课程设计的目的 (1) 2.需求分析 (1) 3任意长整数加法的设计 (2) 3.1概要设计 (2) 3.2详细设计 (3) 3.3调试分析 (9) 3.4用户手册 (10) 3.5测试结果 (10) 4总结 (11) 5、程序清单:(见附录) (11) 7、程序运行结果 (11) 附录1 (13) 1.课程设计的目的 (1) 熟练使用 C 语言编写程序,解决实际问题; (2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 2.需求分析 (1)设计一个实现任意长的整数加法运算演示程序。 (2)利用双向链表实现长整数的存储,每个结点含一个整型变量。 (3)输入输出形式按中国对长整数的表示习惯,每四位一组,用逗号隔开。

3任意长整数加法的设计 3.1概要设计 (1)主界面设计 图 1 图2 主界面,如图1所示,包含四个菜单项,输入数字选择对应菜单,进入子项。其中选项2包含子菜单,如图2所示。 (2)存储结构 本系统用结构体linlist存储数据,该结构体由数据data、下一节点指针next、上一节点指针prior组成。data是short型变量,存放每个结点的数据。本系统中data 一般不超过10000。用结构体linlist构建链表,头结点的data域符号代表长整数的符号,绝对值表示链表结点数目。 (3)系统功能设计 本系统主菜单包含四个选项,功能描述如下: 菜单1:输入两个任意长的整数。可按照标准四位一组中间用逗号隔开输入,也可直接输入,输入的数字保存在文件中,结束后自动返回主菜单。 菜单2:实现两个任意长整数的加法。可直接输入两个数也可读入一个文件,获取两个加数,相加结果可保存在文件中,也可不保存,结束后返回菜单2。 菜单3:输入文件名称,查询文件中的数字。文件中可能保存的是两个加数,也可能保存的是某次两个任意长整数相加的结果。 菜单4:退出系统。

长整数的运算算法与数据结构课程设计报告书

******************* 实践教学 ******************* 兰州理工大学 软件学院 2013年春季学期 算法与数据结构课程设计 题目:长整数的运算

专业班级:软件二班 姓名:齐祥荣 学号: 指导教师:王连相 成绩: 目录 摘要 (1) 前言 (2) 正文 (3) 1.采用类C语言定义相关的数据类型 (3) 2.各模块的伪码算法 (3) 3.函数的调用关系图 (6) 4.调试分析 (7) 5.测试结果 (7) 6.源程序(带注释) (8) 总结 (15) 参考文献 (16) 致谢 (17) 附件Ⅰ部分源程序代码 (18)

摘要 数据结构 该设计要求学生设计程序,实现两个任意长的整数求和及差的运算问题。通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握线性表上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力 关键词:双循环链表;插入;删除;长整数加减

前言 利用双向循环链表来实现对长整数的存储。每个节点只存储四位十进制数字,即不超过9999的非负整数。双向链表有头指针,它的data值存储长整数的符号,1为正,-1为负,0代表长整数为0;它的over值存储除头节点外节点的个数。其他节点的data值存储四位整数,over存储该四位整数溢出0~~9999范围的情况,一般over>0表示四位数超出9999,over<0表示四位数小于0。 选择该数据结构来完成长整数的加减运算是因为要对长整数进行运算,需要对长整数进行存储,所以选择用链表对长整数存储,又由于存储的顺序是从左到右,而运算的顺序则是从右到左,这样位了操作方便选择循环链表,在运算过程中有进位和借位的操作,所以最终选择双向循环链表的数据结构。

长整数的加减运算系统说明文档11003601.

桂林电子科技大学综合设计说明书用纸 《数据结构与算法》 课程设计说明书 题目:长整数的加减运算 学院:计算机科学与工程学院 专业:信息安全 姓名:xxxxxxxx 学号:11003601xx 指导教师:张瑞霞老师

成绩评定标准及成绩 1、能按照格式进行写作,无抄袭现象(10分) 2、报告内容行文通畅,有条理性,无错别字,结构严谨。(10 分) 3、能够按照数据结构课设的格式要求、排版要求和字数要求 等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。(10分) 4、在验收过程中,能合理的回答问题(20分) 5、软件能正常运行,实现所提出的功能(40分) 6、软件代码规范性较好(5分) 7、具有自己的创新或特色(5分) 总成绩:

目录 1、前言 (3) 2、需求分析 (4) 2.1.问题描述: (4) 2.2.基本要求: (4) 2.3.更高要求: (4) 2.4.测试数据: (4) 2.5.开发环境 Visual C++6.0(完整绿色版) (5) 3、系统概述 (5) 3.1.关键技术。 (5) 3.2.相关的函数接口 (6) 3.3.功能设计 (7) 4、系统分析 (7) 5、系统的调试与结果 (17) 5.1.调试过程出现的问题以及解决方法 (17) 5.2.成功的测试数据截图 (17) 6、课设小结 (20) 7、参考文献: (21)

1、前言 本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。 每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。 可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限。 由于在某些工程上进行加减运算时,有时候需要对很大的长整数进行计算,但是计算机本身提供的数据类型无法保证存在几百位甚至几千位的数字,所以需要设计专门的算法系统对数据进行相应的计算。因此本系统的设计主要任务是:设计一个程序能够实现任意长整数的加减运算的程序,而且能够对一些错误异常进行辨别调整,从而迅速计算出正确无误的结果。程序输入格式是字符串,包含元素的范围是数字,都好,负号以及分号,保存时需要用到双链表将字符串每四位保存在循环链表中的一个结点中,然后在计算出运行结果。 虽然程序有些复杂,但使用方法十分简单,只需按照相关提示进行操作即可,能够为用户的学习和工作带来快捷与方便。

数据结构长整数四则运算(DOC)

实习1 1.4长整数四则运算 实习报告 题目:设计一个实现任意长的整数进行加法运算的演示程序。 一、需求分析 1.本演示程序中,利用双向循环链表实现长整数的存储,每个结点含一个整型变量任何整型变量的范围是-(215-1)—(215-1)。在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。输入和输出形式按中国对于长整数的习惯,每四位一组,组间用逗号隔开。 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入数据中的非法字符)和运算结果显示在其后。 3.程序执行的命令包括: (1)构造链表;(2)输入数据;(3)数据处理;(4)结束 4.测试数据 (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。 二、概要设计 struct LinkNode //定义结构体LinkNode { int data; //记录每个节点的整数(小于10000) LinkNode *next; //记录下一个节点的地址 LinkNode *pre; //记录前一个节点的地址 }; class LinkList //定义类LinkList

数据结构课程设计长整数运算

一、需求分析 【问题描述】 设计一个程序实现两个任意长的整数求和运算。 【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整型变量。 任何整型变量的范围是:-(215-1)~(215-1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 【测试数据】 (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”。 二、设计 1. 设计思想 (1)存储结构:循环双向链表 (2)主要算法基本思想: 1、每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加 不会溢出。但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。 2、可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示 元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限。 2. 设计表示 (1)函数调用关系图: (2)函数接口规格说明: 结构体: struct dl_node { int x; dl_node *pre; dl_node *next; };

初始化: void list_init(dl_node ** h) 插入元素: void list_insert(dl_node *h,int x) 输出链表: void prin(dl_node *h) 实现相加: void list_add(dl_node *h1,dl_node *h2) 实现相减: void list_sub(dl_node *h1,dl_node *h2) 3. 详细设计 (1)输入两个数,用链表来存储。链表的头结点的数据的值为1时,表示的是输入的数非负;为-1时表示输入的数是负数。 (2)在创建链表时,让高位在链表的尾部,低位在链表的头部。 (3)在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。 (4)如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。 (5)异号的两个数想加时,先去两个数的绝对值,用较大的数减去较小的数,差作为和的绝对值。如果相应的位够减时,直接做减法,否则借位,但是要注意被借位的值是否为零,如果为零,则继续借位。 (6)输出最终结果,输出数时,要去掉大数最前面的零,直到数的首位不是零时为止。在输出地位的数时,有可能某些单元的数低于四位,必须要在四位数的高位补零,即四位一个单元输出。空缺处用零补齐。 三、调试分析 (1)经过不断的的DEBUG,不断的输出看结果调试,最终成功 (2)经验和体会: 通过这次学习,让我认识到自己在学习上的诸多不足。从刚拿到题目到完成整个编程,从理论到实践,虽然学到很多的的东西,但是也因为自己知识的不足,不能考虑周全,完全成功的完成此次课程设计。在认识自己的不足后,我便开始认真复习书本知识,同时与动手能力强的同学互相交流,让自己学到了很多平时

长整数的四则运算

课程名称: 《数据结构》课程设计课程设计题目: 长整数的四则运算 姓名: 院系: 计算机学院 专业:计算机科学与技术 年级: 学号: 指导教师: 2014 年月日

目录 1 课程设计的目的 (3) 2 需求分析 (3) 3 课程设计报告内容 (3) 3.1概要设计 (3) 3.2详细设计 (3) 3.3调试分析 (3) 3.4用户手册 (4) 3.5测试结果 (4) 3.6程序清单 (5) 4 小结 (x) 5 参考文献 (8)

1.课程设计的目的 (1) 熟练使用 C 语言编写程序,解决实际问题; (2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 2.需求分析 问题描述:设计一个实现任意长的整数进行加法运算的演示程序。基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -215 - 1 215 - 1。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。测试数据:(1)0;0;应输出?0?。 (2)-23456789;-76543211;应输出?-100000000?。(3)-99999999;1000000000000;应输出?999(4)100010001;-100010001;应输出?0?。(5)100010001;-100010000;应输出?1?。(6)-999999999999;-999999999999;应输出?1999999999998?。 (7)1000099999999;1;应输出?1000100000000?。 实现提示:(1)每个结点中可以存放的最大整数为 32767,才能保证两数相加不会溢出,但若这样存放,即相当于按 32768 进制存放,在十进制与 32768 进制数之间的转换十分不方便,故可以在每个结点中仅存十进制的 4 位,即不超过 9999 的非负整数,整个链表表示为万进制。(2)可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。不能给长整数位数规定上限。 3.1概要设计 利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。 3.3调试分析 测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想。

大数据结构课程设计(长整数四则运算)

一、需求分析 1.本程序实现计算任意长的整数的四则运算. 以用户和计算机对话的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数的运算。 2. 利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数,程序会过滤掉无效的字符。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。 3.测试数据(1)0; 0; 输出“0”; (2)-2345,6789; -7654,3211; 输出“-1,000,000”; (3)-9999,9999; 1,0000,0000,0000; 输出“9999,0000,0001”; (4)1,0001,0001; -1,0001,0001; 输出“0”; (5)1,0001,0001; -1,0001,0001; 输出“1”; (6)-9999,9999,9999; -9999,9999,9999; 输出“-1,9999,9999,9998”; (7)1,0000,9999,9999; 1; 输出"1,0001,0000,0000". 二、概要设计 为实现上述程序功能,应以双向循环链表表示长整数。为此,需要定义一个抽象数据类型。 1. 抽象数据类型定义为:

ADT OrderedList{ 数据对象:D={ai|ai∈int,i=1,2,...n, n≥0} 基本操作: init(&a,digit4) 操作结果:构造一个位数是digit4*4长整数。 pass(&a,&b,&c) 初始条件:a,b,c都已存在 操作结果:c等于a和b的和。nep(&a) 初始条件:a已存在。 操作结果:a变为输入参数的相反数。printlong(&a) 初始条件:a已存在。 操作结果:按四位一组,分隔符为","的格式,在屏幕上输出a。ston(&S,&a) 初始条件:a已存在。 操作结果:把字符串形式的长数字赋给a。}ADT OrderedList 2.本程序包含两个模块: 1)主程序模块:V oid main(){ 选择操作: 1:帮助。 2:加法。 3:减法。

C语言 长整数加减乘

长整数加减乘 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define NULL 0 typedef int Status; //--链表定义-- typedef struct DuLNode{ Status data; //数据域 struct DuLNode *next,*prior; //指针域 }DuLNode,*DuLinkList; int i; char str[400]; Status turn(Status &data){ for(int j=0;i>=0;--i,j++) { if(str[i]=='-'&&i==0)break; if(j%4==0)data=str[i]-'0'; if(j%4==1)data+=10*(str[i]-'0'); if(j%4==2)data+=100*(str[i]-'0'); if(j%4==3){data+=1000*(str[i]-'0');--i; if(i==-1||str[i]=='-')return OK;return 0;} if(i==0)return OK; } return OK; } Status Input(Status &data){ return turn(data); } Status ListCreate_L(DuLinkList &L,DuLinkList &dl){ DuLNode *r,*q; //r指向尾结点,q指向新开辟结点 L=(DuLNode*)malloc(sizeof(DuLNode)); if(L==NULL)exit(-1); r=L;q=L; for(;;){

两个任意长的整数的求和运算

软件综合课程设计两个任意长的整数的求和运算 进制的转换 2014 年6月

目录 一、问题陈述 二、需求分析 三、概要设计 四、详细设计 五、程序代码 六、运行结果与测试 七、设计体会与总结

两个任意长的整数的求和运算 一、问题陈述 设计一个程序实现两个任意长的整数的求和运算。 利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。 二、需求分析 1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。 2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。 3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以#结束,每四位一组。 三、概要设计 在此说明数据结构设计和关键的算法设计思想 Add()函数是实现该问题的主要函数即相加。 typedef struct et 定义双循环链表的存储结构. void setin(dtp *a) 读入数据存储在双链表中的函数; void print1(dtp *w,int len) 原样输出输入的数,略去结束符"#"; void print2(dtp a,int len) 输出运算结果,以每四位一个","样式; 四、详细设计 程序流程图

五、程序代码 #include using namespace std; #define null 0 typedef struct et {

长整数的进制转换

长整数的进制转换 发表时间:2018-08-22T13:44:33.280Z 来源:《教育学》2018年8月总第151期作者:贺小龙[导读] 在完成长整数的加减乘除运算时很麻烦,就是做通了也没拿满分。才知道用重载的方法可以直接完成数组和整数间加减乘除运算。 新疆乌鲁木齐兵团一中830002 在完成长整数的加减乘除运算时很麻烦,就是做通了也没拿满分。才知道用重载的方法可以直接完成数组和整数间加减乘除运算。 结构体:用结构体内数组储存长整数,用结构体中的变量表示该整数的具体长度。#include / #include / using namespace std;/ struct hh{/结构体 int n[200],l;/数组int n[200]储存长整形数}X;/整数l表示该长整数的确实位数加:这里考虑的是长整数+整数的情况。当然了两个长整数也是可以解决的。相对而言加是简单的,要考虑进位的事情,还有长整数长度的变化。 hh operator+(hh a,int y){/结构体和整数的加法a.n[1]+=y;/将该整数加到长整数的第一位int i=1;/从第一位开始while(a.n[i]>0||i<=a.l){/或者某位数大于0,或i小于等于长整数的长度都要循环a.n[i+1]+=a.n[i]/10;/将进位加到下一位a.n[i]%=10;/原位置留下个位i++;/准备算下一位 }/ a.l=i-1;/长整数的长度时i-1 return a;/返回该长整数 }/ 乘:加是只加到第一位就行,而乘是要乘到每一位上。hh operator *(hh a,int y){/ for(int i=1;i<=a.l;i++)a.n[i]*=y;/对每一位完成乘运算for(int i=1;i<=a.l;i++){/ a.n[i+1]+=a.n[i]/10;/每一位大于10的部分加给下一位if(i==a.l&&a.n[i+1])a.l++;/如果是最后一位,而且下一位有内容,长度就得增加a.n[i]%=10;}/原位子留下个位数if(y==0)a.l=1;/如果和0乘的话,长整数位数变成1 return a;/ }/ 除:除得从最后一位算。如果数大于除数,就直接除,商是要得到的结果,余数乘10加到下一位;如果小,商就补零。hh operator/(hh a,int y){/ int d=0,x;/ for(int i=a.l;i>=1;i--){/从最后一位遍历长整数x=d*10+a.n[i];/除数是余数乘以10加上该位if(x>=y){a.n[i]=x/y;d=x%y;x=0;}/如果被除数大于除数,该位留下商,余数要留着下次除时用。else{d=x;a.n[i]=0;}/否则,该位留下零}/ while(a.n[a.l]==0&&a.l>1)a.l--;/如果最后一位是零,就要一直缩减。很精妙return a;/ }/ 求余数:求余数跟找商基本是一样的,只是要返回的是余数。int operator %(hh a,int y){/ int d=0,x;/ for(int i=a.l;i>=1;i--){/也是从最后一位(也就是最左边的数字,高位)往前遍历x=d*10+a.n[i];/被除数是余数*10+当前位数if(x>=y){d=x%y;x=0;}/只有被除数大于除数,才可以除。当然这里只需要余数,此时被除数要变成0。else {d=x;a.n[i]=0;}/否则余数变成被除数}/ return d;/ }/ 主程序:按照题意是要用逗号分开原进制,要转换进制的数和转换成的进制。这里用文本记住所有信息,再分割开。main(){/ int m;cin>>m;/共几组数据

长整数的加法运算-数据结构与算法课程设计

题目:长整数的加法运算 学院:计算机科学与工程学院 专业:信息安全 姓名:农锦文 学号:1200360220 指导教师:张瑞霞 2014年10月18日

目录 引言 (4) 1、系统概述 (4) 2、系统分析 (5) 2.1需求分析 (5) 2.2系统功能 (5) 2.3开发环境 (5) 3、详细设计 (5) 3.1功能结构框图 (6) 3.2 软件设计 (6) 3.2.1 定义链表与接收数据输入 (6) 3.2.2长整数的加法运算 (8) 3.2.3显示长整数相加结果 (10) 4、所遇到的问题和分析解决 (10) 5、系统特色及关键技术 (11) 6、结论 (11) 参考文献 (12)

引言 随着计算机技术的发展,人们利用计算机开发了许许多多方便的,实用的应用软件,在信息化的现代社会里,人们依赖着很多的应用软件,这些软件在推进社会发展的同时,也丰富了人们的生活,然而,在开发过程中,由于计算机系统的局限性,在需要某些功能时,总会遇到困难。例如在开发某些工程项目时,有时需要对很大的数进行计算。但是计算机本身无法计算某些较大的数,所以我们有必要设计专门的算法对一些较大的数进行相应的计算,通过简化运算之后,对其他程序功能的编写能起到良好的促进作用,大大的减轻了程序员的负担。此次设计的程序将用于长整数的加法运算,程序运行时,将提示用户输入两个长整数,然后将两个长整数相加的结果输出。 1、系统概述 在该长整数加法运算系统中,我将定义双向循环链表来表示长整数,按照中国对长整数的表示方法,如199999999表示为1,9999,9999。双向循环链表数据域存储的是长整数的每4位。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。通过造双向循环链表,可以对长整数进行方便的存储,在对长整数进行数学运算时,也能通过方便的操作链表,从而对长整数进行需要的计算。 在实现该长整数加法运算的系统中,我将会编程实现以下功能。定义一个函数,用于接收长整数的输入,同时将长整数存储到双向循环链表当中,为了检验是否按预期要求进行存储,我还会编写一个函数,将双向循环链表中数据域的值打印出来。定义一个长整数相加的函数,实现两个长整数加法运算的功能,实际上是对双向循环链表进行操作,这里包括结点空间的申请,插入结点,修改指针所保存的值。 当两个长整数完成加法运算后,我会定义一个显示结果的函数,将它们相加的结果打印出来。一些较大的整数,在单纯的用计算机进行相加运算的时候可能会产生溢出现象,但该系统每次只对4位整数进行运算,避免了数据过大在计算时产生的溢出问题。

(完整word版)c++实现任意长整数的四则运算

实验题目:设计一数据结构可处理任意长度的整数 概要设计 1.数据结构的定义 采用双向链表存储任意长整数。双向链表的定义如下: class DblList { private: DblNode *head, *tail; DblNode *current; int sign; public: DblList(); //构造函数 ~DblList(); //析构函数 bool CreatList(string); //生成一个双向链表,存储整数 int GetCount(); //获取整数的长度 void Insert(DblNode *); //从表尾插入一个结点 void InsertFront(DblNode *); //从表头插入 void Clear(); //清除该链表 void operator+(DblList &); //实现两个任意整数的加法 void operator*(DblList &); //实现两个任意整数的乘法 DblList & operator=(DblList &); //重载赋值运算符 int Compare(DblList &); //两个整数的绝对值比较 void Display(); //任意长度整数的标准化输出}; 说明:数据的存储,无外乎顺序或者链表。顺序存储时,定义数组无法实现任意长度,而且需要预设一个maxsize,不是特别的方便。所以采用链式存储方式。而且任意长数据通过字符串输入。在链表的每一个结点中,数据域是在该数位上的数字大小。 2.主要功能模块的功能 ◆任意长整数的输入 ◆任意长整数的标准化输出 ◆两个整数的加法 ◆两个整数的乘法 三.详细设计(主模块流程图)

任意长整数的四则运算

1 题目介绍和功能要求 1.1 课程设计题目要求 【问题描述】: 设计一个实现任意长的整数进行加法运算的演示程序。 【题目容】: 利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的围是-(215- 1)~(215- 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 【基本要求】: (1)利用所学知识,设计相应的数据结构; (2)熟练运用开发环境; (3)完成软件的设计与编码; (4)熟练地掌握基本的调试方法。 1.2 题目分析 【需求分析】: (1)本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。 (2)本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。

(3)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。 2 系统功能模块结构图 2.1 系统功能结构框图 图2.1 系统功能结构图 2.2主要模块的功能说明: (1)主调程序模块: void main() {

初始化; do{ 接受命令; 处理命令; }while(“命令”=”退出”) } (2)双向循环链表处理模块//cmplinklen.h //Creat.h //compare 说明:进行链表的存储和处理 (3)长整数运算模块//add.h // sub.h //imul.h //idiv.h 说明:对长整数进行四则运算 (4)界面模块//title.h //welcome.h 说明:控制系统运行操作界面 3 数据结构的设计及用法说明 3.1概要说明 为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。为此需要两个结构数据类型:双向循环链表和长整数。 3.2用法说明 3.2.1 双向循环链表的数据结构定义: typedef struct Node //双向循环链表结点

数据结构课程设计报告长整数运算范文

数据结构课程设计报告长整数运算

数据结构课程设计报告 题目:长整数四则运算 一、需求分析 1.问题描述: 由于工程上有时候需要对很大的数进行计算,可是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,因此需要设计专门的算法对数据进行相应的计算。此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。 2.基本功能 功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。 功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。 3.输入输出 程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。 输入时用字符串输入,输出时以一链表结点输出,而且每个结点

表示四位。 二、概要设计 1.设计思路: 由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。将各部分的结果整合起来。由于计算机固有的整数类型存数的对大整数是2^15-1,因此为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。从最低位开始加法,超过一万向上进位,因此每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算能够借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。 2.数据结构设计: 因为计算的是一个连续的数字,需要桉顺序一次计算,因此采用的数据结构的逻辑结构是线性表。因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。 1.双向循环链表的抽象数据类型定义为: ADT Link {

长整数四则运算实验报告

一、需求分析 设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。 测试数据:0、0;输出“0” 2345,6789、-7654,3211;输出“1,0000,0000” 1,0000,0000,0000、9999,9999;输出“9999,0000,0001” 1,0001,0001、;1,0001,0001;输出“0” 自选数据:1,1111;1,1111 输出“0” 二、概要设计 1、数据结构 利用双向循环链表来实现对长整数的存储。 选择该数据结构来完成长整数的加减运算是因为 a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。 b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环 链表。 c.在运算过程中有进位和借位的操作。 2、使用算法 定义双向循环链表,存储数据,进行计算。(默认较长的数作为被加数、被减数) 三、详细设计 typedef struct DoubleNode //定义链表元素 void InitNode(DLNode **head) //初始化链表 int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素X

int digit(int n) //判断整数N有几位 void PrintNode(DLNode *head) //打印链表 void DestroyNode(DLNode **head)//销毁链表 void add(DLNode *h1,DLNode *h2) //两数相加 void jian(DLNode *h1,DLNode *h2) //两数相减 int main() //入口函数 四、调试分析 由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。老师在检查的过程中指出并教导了这一点。 五、测试结果 1、输入0和0做加法运算,输出“0”,结果如下图: 2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图: 3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”, 结果如下图:

相关文档
最新文档