《超长整数的存储与运算设计说明书》由会员分享,可在线阅读,更多相关《超长整数的存储与运算设计说明书(22页珍藏版)》请在金锄头文库上搜索。
1、计算机科学系课程设计任务书摘 要 计算机计算结果的精度,通常要受到计算机硬件环境的限制。在C语言和VB中对于有符号的长整型数据的范围是-2147483648到2147483647之间,用户一般是无法改变的。但是,我们可以通过“软”的方式来解决这一困难,即通过程序设计的方法进行超长整型数据的计算。运算因子超出了整型能表示的范围,肯定不能直接用一个数的形式来表示。在C语言中,能表示多个数的数据类型有两种:数组和字符串。因此采用字符串读入数据,用数组存储数据。解决了高级程序设计语言处理数据存储空间问题,实现了超长整数的加减乘除求余运算。超长整型数据的存储与运算设计对超长整数分别进行了存储与加减乘除求
2、余运算,达到了预期目标,最后对实现算法做了简要的分析和介绍。关键词:超长整型数据;字符串;数组AbstractComputer calculation results, the precision of computer hardware environment is usually to the limit. In C language and VB to have long integer data of symbols of integers range is 2147483648 - between the users to cant be changed. However, we c
3、an use the word soft way to solve this difficult, namely through programming method for long integer data calculation. Computing factor beyond the scope of integer can say, must not be directly used a number of forms. In C, can say the number of data types is more than two kinds: arrays and string.
4、Therefore, the use of input data using string array of data storage. Solve a high-level programming language processing data storage space, the problem of long integer arithmetic for more add, subtract, multiply and divide.Long integer data storage and operation of long integer separately designed f
5、or the storage and add, subtract, multiply and divide more computing, and finally reached the expected goal to realize algorithm provides a brief introduction and analysis.Keywords: long integer;string;array / 目录第一章 绪论11.1 课程背景11.2 课程目的11.3 课程意义11.4 课程设计采取的基本原理和主要技术方法1第二章 设计简介及设计方案论述22.1 程序的主要功能22.2
6、 程序设计的思想22.2.1运算数据、结果的输入和存储22.2.2超长整数加法运算22.2.3超长整数减法运算32.2.4 超长整数乘法运算32.2.5 超长整数的整除及求余运算4第三章 详细设计53.1 超长整型数据的输入53.2 超长整数的加法53.3 超长整数的减法63.4 超长整数的乘法63.5 超长整数的整除及求余7第四章 设计结果及分析104.1 设计概述104.2 设计约束104.3 运行流程10总 结11致 谢12参考文献13附录14第一章 绪论1.1 课程背景 随着现代社会计算机科学技术与经济的不断飞速发展,计算机在科学计算与人们日常生活中的应用也越来越普及,利用计算机实现一
7、些数据的存储与计算也显得越来越重要,因而相对于科学计算精度的要求也越来越高。国民生产总值的统计,中央银行货币的统计,国家粮食生产量的统计等超大数值统计都需要有高精度的数据处理方式。在数学上,大数研究也需要对超长数值的运算进行处理。由此可见,超长整形数据的设计的意义是重大而深远的。1.2 课程目的 学习并掌握计算机对于整型数据的存储与运算方法及原理,并能够运用C语言来编写程序,实现超长整型数据的存储与运算,解决科学计算与实际生活中的相关问题。1.3 课程意义1、掌握超长整数的计算基本方法并能应用。2、掌握超长整数加法、超长整数减法、超长整数乘法。3、掌握超长整数除法运算中被除数、除数、商和余数之
8、间的关系。4、分析总结常用超长整数算法特点,并能编写相应的程序。5、在学习的过程中应强化“算法领先”的意识,根据实际情况对超长整数运算进行优化的策略与方法。1.4 课程设计采取的基本原理和主要技术方法本程序是专门针对超长整型数据而开发的一个功能齐全、操作简单的存储与运算程序。本程序实现以下基本功能:操作人员可以对超长整型数据进行存储,还可以对所输入的数据进行准确的加减乘以及整除求余运算本系统使用的是VC6.0来开发的,由于VC良好的面向对象功能,真正实现了面向对象的设计。第二章 设计简介及设计方案论述2.1 程序的主要功能超长整型数据的存储与运算的主要任务是用计算机对C语言和VB中对于超出有符
9、号的长整型数据范围-2147483648到2147483647的数据进行存储与运算,如加法、减法、乘法、整除以及求余运算,迅速准确地完成对超长整型数据的计算功能,快速输出运算结果。 2.2 程序设计的思想2.2.1运算数据、结果的输入和存储运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在C语言中,能表示多个数的数据类型有两种:数组和字符串。 数组:每个数组元素存储1位(在优化时,这里是一个重点!),有多少位就需要多少个数组元素;用数组表示数的优点:每一位都是数的形式,可以直接加减;运算时非常方便。用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不
10、符合数值的输入习惯;字符串:用字符串表示数的优点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算;运算时非常不方便;综合以上所述,对上面两种数据结构取长补短:用字符串读入数据,用数组存储数据:2.2.2超长整数加法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定和的位数设LA为A的位数,LB为B的位数,则两数之和的位数最大为较大加数位
11、数加1,即如果LALB,则和的位数最大为LA+1。3、进位处理两数相加时,从低位到高位,各位数字分别相加,然后对相加后的数和10进行整除和求余运算,整除之后的值为进位,而余数就等于所求数之和。不断重复,直到最高位为止。 2.2.3超长整数减法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定差的位数设LA为A的位数,LB为B的位数,则两数之差的位数最大为较大数的位数,即如果LALB,则差的位数最大为LA。3、借位处理做减法运算时,要先判断是否需要借位,如
12、果需要借位,从上一位借过一个10,上一位的数减去1,处理完之后再相减。2.2.4 超长整数乘法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定积的位数设LA为A的位数,LB为B的位数,乘积的位数最多为LA+LB,最少为LA+LB-1。所以,乘积的位数上限为LA+LB。3、算法首先计算被乘数与乘数的个位数字的乘积,把结果保存到积数组中,然后再用被乘数去乘以乘数的十位数字,把结果退一位加到积数组中。每加一次乘积结果就进行一次进位处理,其方法与加法中的进位处
13、理一样。2.2.5 超长整数的整除及求余运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A和B数组中,最低位在第一个单元中。2、算法可以用减法代替除法运算:不断比较A1.n与B1.n的大小,如果A1.n=B1.n则商C1.n+1C1.n,然后就是一个减法过程:A1.n-B1.nA1.n。由于简单的减法速度太慢,故必须进行优化。设置一个位置值J,当A1.nB1.n时。B1.n左移B0.n,j:=j+1,即令B1.n增大10倍。这样就减少了减法的次数。当j0且A1.nB0.n时,B0.n右移B0.n,j
14、:=j-1,即令B1.n缩小10倍。第三章 详细设计3.1 超长整型数据的输入void input(int a1,int a2) /*函数input为输入函数,用来纪录两个待计算的超长整数 */ int i,fa=1,fb=1; printf(请输入第一个数:n); scanf ( %s, b1); printf(请输入第二个数:n); /*输入两个超长整型数据*/ scanf(%s,b2);lena = strlen( b1 ); /*lena纪录b1的位数*/ lenb = strlen( b2 ); /*lenb纪录b2的位数*/ if(b10=-) lena-; da=-1;fa=0; /*判断数组的符号*/ if(b20=-) lenb-; db=-1;fb=0; for (i=0; ilena; i+,fa+) a1i=b1lena-fa-0; /*把字符形数据b1转为整数形数据,同样用数组纪录*/ for (i=