大数加减运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NANCHANG UNIVERSITY
课程设计报告
课程名称:计算机技术综合课程设计
题目:大数的加减运算
学院:信息工程学院系:计算机科学与技术系
专业:网络工程
班级: 1 3 1 班
学号:610321301?
学生姓名:张
时间:2016.8.29~2016.9.8
摘要 (1)
引言 (2)
问题描述 (2)
第一章分析与设计 (2)
第二章各个模块的实现方法描述 (3)
1、显示与输入模块 (3)
2、大数加减运算模块 (3)
2.1 无符号加法运算的实现——PLUS方法 (4)
2.2 无符号减法运算的实现——MINUS方法 (4)
2.3 有符号加减运算的实现——add方法和sub方法 (6)
第三章运行结果效果图 (8)
第四章实验总结 (10)
第五章附录:程序源代码 (11)
1.输入与显示模块:UI类 (11)
2. 大数运算模块:GetResult类 (15)
第六章参考文献 (21)
在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234+5678,这样的数值并没有超出计算机的表示范围,所以可以运算。但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,这就涉到大数运算。大数运算,顾名思义,就是很大的数值的数进行一系列的运算。本文采用一个在JAVA语言下实现大数运算的一个程序为例,讲解包括了大数的加法,减法的算法及代码。
关键字:大数、运算精度、大数加减
引言
大数运算,意味着参加的值和计算结果通常是以上百位数,上千位数以及更大长度之间的整数运算。大数运算在当代社会得到了广泛运用。大数运算不仅仅运用在密码学中,保护网络信息安全,还在物理学、天文学、化学等学科的科研活动中发挥重要作用。例如大家所熟知圆周率π的值,在一般的数值计算中用到圆周率的不须要多大的精度,但在天文学计算一些星球或是星系上的体积面积时便显的误差很大了,这时π值计算的精度应该达到几百万位甚至更高,才能缩小误差,这就涉及到大数运算。
问题描述
本次课程设计的题目就是实现大数加减运算,要实现以下要求:
1、参与运算的2个大数从键盘输入;
2、输入的数据为十进制整数;
3、数的十进制位数不低于20位。
编码实现语言没有限制,所以我决定使用我比较熟悉的Java来实现。
第一章分析与设计
要实现上述大数加减运算程序,需要两个模块:
1.显示与输入模块,用来获取从键盘输入的两个大数,并显示计算结果。
2.大数加减运算模块,根据用户输入的两个大数和选中的运算类型,进行
加减运算。
图1:大数运算模块示意图 第二章 各个模块的实现方法描述
1、显示与输入模块
本模块由名为UI 的类实现,UI 类有以下几个方法(详细代码请查看附录):
(1)setWinStyle()方法,其作用是设置窗口显示风格为微软风格,美化图形界面的显示效果,移除Java 默认的窗口风格。
(2)setMyFont()方法,设置输入输出的字体为指定字体。
(3)initGUI()方法,初始化图形界面。
(4)Listener()方法,添加事件监听器。
(5)UI()构造方法,调用以上方法完成UI 类的初始化。
(6)getInput()方法,获取输入的大数。
(7)静态main 方法,应用程序的入口。
其中,图形界面的布局主要采用GridLayout 和BorderLayout 。
2、大数加减运算模块
该模块是本程序的核心模块,被显示与输入模块调用,进而实现加减运算功能。本模块由名为GetResult 的类实现,当UI 类需要显示计算结果时,只需创建GetResult 的实例,调用GetResult 类的相关方法,并传递参与运算的两个大数对应的字符串即可(加法调用GetResult 的add 方法,减法调用sub 方法)。
GetResult 的核心是PLUS 和MINUS 方法,PLUS 方法实现无符号大整数的加法,MINU 方法实现无符号大整数的减法,add 方法、sub 方法基于PLUS 与MINUS 方法实现了有符号的大整数的加减。
大数加减运算程序模
显
示
与
输
入
模
块
大 数 运 算 模 块
2.1 无符号加法运算的实现——PLUS方法
加法计算还是比较容易的,我们也是先从低位算起,因为只须要对应的位相加,再加上前一位的进位,再去判断是否本位是否有进位,有则把本位数字改为减去它的权,也就是10,再置进位为1。如果没有进位,则给进位赋值0。
事实上,输入的两个大数均为字符串,对将第一个大数反转所得到的字符串命名为number1,第二个大数命名反转所得到的字符串为number2,对于第i位
int c=int (number1.[i] + number2.[i] - 96);
若c<10则表明该位相加没有进位,c>10则表明有进位。
若int carry=c/10,则对于加法运算结果反转所得字符串result的第i+1位满足(carry表示来自低位的进位):
int temp=number1.[i+1] + number2.[i+1]+carry - 96;
result[i+1]=temp%10;
图2:加法运算示意图
在实际编码中,为了提高效率,先将number1.[i] + number2.[i] - 48的值以字符的形式存在字符串容器result的第i个位置中,这样两个数相差较大时可以减少循环次数,最后再统一进行处理。
2.2 无符号减法运算的实现——MINUS方法
减法稍微有一点复杂,因为会处理负数,而我们所用的是字符串的形式来保存数字也是为这一点。否则用整型或其它类型时,则表示处理、保存时会相当复杂。算法也是从低位开始减。先要判断减数和被减数那一个大,减数位大