长整数的四则运算_精品文档.docx

上传人:b****2 文档编号:1525181 上传时间:2022-10-22 格式:DOCX 页数:12 大小:184.16KB
下载 相关 举报
长整数的四则运算_精品文档.docx_第1页
第1页 / 共12页
长整数的四则运算_精品文档.docx_第2页
第2页 / 共12页
长整数的四则运算_精品文档.docx_第3页
第3页 / 共12页
长整数的四则运算_精品文档.docx_第4页
第4页 / 共12页
长整数的四则运算_精品文档.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

长整数的四则运算_精品文档.docx

《长整数的四则运算_精品文档.docx》由会员分享,可在线阅读,更多相关《长整数的四则运算_精品文档.docx(12页珍藏版)》请在冰豆网上搜索。

长整数的四则运算_精品文档.docx

课程名称:

《数据结构》课程设计

课程设计题目:

长整数的四则运算

姓名:

院系:

计算机学院

专业:

计算机科学与技术

年级:

学号:

指导教师:

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-1215-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调试分析

测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?

问题如何解决?

),算法的改进设想。

3.4用户手册(略)

3.5测试结果(略)

4总结

长整数用双向循环队列的数据结构,用的比较少,查阅不少资料

5、程序清单:

(见附录)

#include

#include

#include

#include

usingnamespacestd;

structLinkNode

{

intdata;//记录每个节点的整数(小于10000)

LinkNode*next;//记录下一个节点的地址

LinkNode*pre;//记录前一个节点的地址

};

classLinkList

{

private:

LinkNode*head0,*head1;//head0,head1分别记录两个整数链表的头指针

LinkNode*currptr;

LinkNode*result;//result记录结果链表的头指针

public:

LinkList();//构造函数,初始化链表

~LinkList();//析构函数,释放空间

voidCreat(stringa);//引入字符串,创立两个链表,分别表示两个整数

voidAdd();//实现两个整数相加

voidDisplay();//显示结果

voidaddtwo();

//节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的

};

intsum(intn);

LinkList:

:

LinkList()//构造函数,初始化链表

{

head0=newLinkNode;

//申请一个空间记录整数的符号和节点数

head1=newLinkNode;

head0->next=head0;

head0->pre=head0;//初始化链表,建立双向循环链表

head1->next=head1;

head1->pre=head1;

result=newLinkNode;

result->next=result;

result->pre=result;

currptr=NULL;

}

LinkList:

:

~LinkList()//析构函数,释放空间

{

LinkNode*p1=head0,*p2=head1,*p3=result;

//三个指针分别指向三条链表的头指针

while(p1!

=p1->pre)

{

p1->pre->next=p1->next;

p1->next->pre=p1->pre;

currptr=p1;

p1=p1->next;

deletecurrptr;

}

while(p2!

=p2->pre)//逐个删除节点,释放空间

{

p2->pre->next=p2->next;

p2->next->pre=p2->pre;

currptr=p2;

p2=p2->next;

deletecurrptr;

}

while(p3!

=p3->pre)

{

p3->pre->next=p3->next;

p3->next->pre=p3->pre;

currptr=p3;

p3=p3->next;

deletecurrptr;

}

}

voidLinkList:

:

Creat(stringa)//引入字符串,创立两个链表,分别表示两个整数

{

inti=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;

//i记录字符串,j记录加数节点数;s记录被加数节点数

//w标记字符串中的‘-’号

//k记录字符串中的字符转化为整数的值,l使每个节点记录4位

while(a[m]!

=';')m++;//m记录字符串中被加数的字符数

n=m;

while(a[n]!

='\0')n++;//n记录字符串的总字符数

if(a[0]=='-')

{

head0->data=(-1);//记录整数符号

w=1;

}

else{head0->data=1;}

for(i=m-1;i>=w;i--)

{

if(a[i]!

=',')//把字符转化为整数

{

k+=(a[i]-'0')*sum(l);

l++;

}

if(a[i]==','||i==w)

{

currptr=newLinkNode;//把整数存到双向循环链表中

currptr->data=k;

currptr->next=head0;

currptr->pre=head0->pre;

head0->pre->next=currptr;

head0->pre=currptr;

head0=currptr;

s++;//节点数加1

k=0;//重新初始化k和l

l=0;

}

}

head0->pre->data*=s;//存储整数符号和节点数

//与建第一个整数链表一样,建立第二个整数链表head1

k=0;l=0;

if(a[m+1]=='-')

{

head1->data=(-1);

m++;

}

else

head1->data=1;

for(i=n-1;i>m;i--)

{

if(a[i]!

=',')

{

k+=(a[i]-'0')*sum(l);

l++;

}

if(a[i]==','||i==m+1)

{

currptr=newLinkNode;

currptr->data=k;

currptr->next=head1;

currptr->pre=head1->pre;

head1->pre->next=currptr;

head1->pre=currptr;

head1=currptr;

j++;

k=0;

l=0;

}

}

head1->pre->data*=j;

}

voidLinkList:

:

Add()//实现两个整数相加

{

LinkNode*temp;

if(abs(head0->pre->data)>abs(head1->pre->data))

//两个整数中,绝对值大的为被加数

addtwo();

elseif(abs(head0->pre->data)pre->data))

{

temp=head0;

head0=head1;

h

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1