为了账号安全,请及时绑定邮箱和手机立即绑定

C语言程序设计-长整数加法运算

标签:
C++ C#

课程设计题目及要求:长整数加法运算

【问题描述】

设计一个实现任意长的整数进行加法运算的演示程序。

【基本要求】

利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是-(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 ;

}

程序清单:

源代码:

运行结果:

错误提示:非法字符:

课程设计总结

通过课设,对链表的理解更深一些,对于链表的添加,删除和插入都更熟悉;

在检查程序的时候,调试的时候发现在循环一遍后,有些变量忘记重新初始化;

在查错的时候,输入非法字符程序会崩溃,进行控制判断后,可以输出错误信息提示;

参考资料: 李戈视频. 钱能教材

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消