课程设计题目及要求:长整数加法运算
【问题描述】
设计一个实现任意长的整数进行加法运算的演示程序。
【基本要求】
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是-(215-l)~(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” 。
(6) -9999,9999,9999;-9999,9999,9999;应输出 “-1,9999,9999,9998” 。 (7) 1,0000,9999,9999;1; 应输出 "1,0001,0000,0000 " 。
【实现提示】
(1) 每个结点中可以存放的最大整数为 215-1=32767, 才能保证两数相加不会溢出。但若这样存放,即相当于按32768进制数存放,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。
(2) 可以利用头结点数据域的符号代表长整数的符号。相加过程中不要破坏两个操作数链表。不能给长整数位数规定上限。
(3)实现长整数的四则运算;
【选作内容】
(1)实现长整数的乘方和阶乘运算;
(2)整型量范围是- (2n-1) ~ (2n-1), 其中,n是由程序读人的参量。输入数据的分
组方法可以另行规定
系统功能和原始数据
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” 。
(6) -9999,9999,9999;-9999,9999,9999;应输出 “-1,9999,9999,9998” 。
(7) 1,0000,9999,9999;1; 应输出 "1,0001,0000,0000 " 。
2.系统功能
用链表来实现任意长度的长整数的加法
程序总体设计
(1)数据结构
采用双向链表
(2)模块划分和层次结构
十一个函数,main函数在开头;
调用每个函数;
(3)函数原型清单
1.int Compare(dnode *a, dnode *b) ;
功能:用来比较链表中存入的两个数的大小
2.void InitNode(dnode **head);
功能: 初始化链表
3.int InitNumber(dnode *head, char *data) ;
功能:将字符转化为数字后,插入数字
4.void InsertNode(dnode *head, int x);
功能: 创建插入节点
5.void InsertNodePre(dnode **head, int x);
功能: 相加后,将结果插入已有节点的前面
6.void Addition(dnode *a, dnode *b) ;
功能: 相加
7.dnode* add(dnode *a, dnode *b) ;
功能: 进行相加,结果存入链表中,返回头指针
8.dnode* sub(dnode *a, dnode *b) ;
功能: 进行相减,结果存入链表中,返回头指针
9 void des( dnode *head);
功能:销毁链表,释放内存;
9.void PrintNode(dnode *head);
功能: 输出链表
(4)程序总体框架
功能模块函数设计和调试
主要模块:
加法:dnode* add(dnode *a, dnode *b)
功能:实现两个同号的长整数相加;每个相加后的节点存入创建的新链表;
要考虑到进位,满10000进一,每次计算时要注意加上进位的数值;
num = x + y + jin;//两个相加,在加上进位的;
jin = num /10000;//因为是万进制,所以满万进一;
num = num%10000;;
if(jin > 0)//如果从后往前最后一位相加后,有进位的话,
InsertNodePre(&head, jin);
减法:dnode* sub(dnode *a, dnode *b)
功能: 这个函数用来 实现两个异号的长整数相减;每个相加后的节点存入创建的新链表中;
要考虑到借位,每次相减要减去借位的数值
num = x - y - borrow;//减去借位的
borrow = 0;//初始化变量
if(num < 0){
borrow = 1;
num =num + 10000 ;
}
程序清单:
源代码:
运行结果:
错误提示:非法字符:
课程设计总结
通过课设,对链表的理解更深一些,对于链表的添加,删除和插入都更熟悉;
在检查程序的时候,调试的时候发现在循环一遍后,有些变量忘记重新初始化;
在查错的时候,输入非法字符程序会崩溃,进行控制判断后,可以输出错误信息提示;
参考资料: 李戈视频. 钱能教材
共同学习,写下你的评论
评论加载中...
作者其他优质文章