超长整数的存储与运算设计说明书

上传人:lisu****2020 文档编号:157119920 上传时间:2022-09-28 格式:DOC 页数:22 大小:133.52KB
收藏 版权申诉 举报 下载
超长整数的存储与运算设计说明书_第1页
第1页 / 共22页
超长整数的存储与运算设计说明书_第2页
第2页 / 共22页
超长整数的存储与运算设计说明书_第3页
第3页 / 共22页
资源描述:

《超长整数的存储与运算设计说明书》由会员分享,可在线阅读,更多相关《超长整数的存储与运算设计说明书(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、设计的思想2运算数据、结果的输入和存储2超长整数加法运算2超长整数减法运算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、掌握超长整数除法运算中被除数、除数、商和余数之间的关系。4、分析总结常用超长整数算

8、法特点,并能编写相应的程序。5、在学习的过程中应强化“算法领先”的意识,根据实际情况对超长整数运算进行优化的策略与方法。1.4 课程设计采取的基本原理和主要技术方法本程序是专门针对超长整型数据而开发的一个功能齐全、操作简单的存储与运算程序。本程序实现以下基本功能:操作人员可以对超长整型数据进行存储,还可以对所输入的数据进行准确的加减乘以及整除求余运算本系统使用的是VC6.0来开发的,由于VC良好的面向对象功能,真正实现了面向对象的设计。第二章 设计简介及设计方案论述2.1 程序的主要功能超长整型数据的存储与运算的主要任务是用计算机对C语言和VB中对于超出有符号的长整型数据范围-21474836

9、48到2147483647的数据进行存储与运算,如加法、减法、乘法、整除以及求余运算,迅速准确地完成对超长整型数据的计算功能,快速输出运算结果。 2.2 程序设计的思想运算数据、结果的输入和存储运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在C语言中,能表示多个数的数据类型有两种:数组和字符串。 数组:每个数组元素存储1位(在优化时,这里是一个重点!),有多少位就需要多少个数组元素;用数组表示数的优点:每一位都是数的形式,可以直接加减;运算时非常方便。用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不符合数值的输入习惯;字符串:用字符串表示数的优

10、点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算;运算时非常不方便;综合以上所述,对上面两种数据结构取长补短:用字符串读入数据,用数组存储数据:超长整数加法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定和的位数设LA为A的位数,LB为B的位数,则两数之和的位数最大为较大加数位数加1,即如果LALB,则和的位数最大为LA+1。3、进

11、位处理两数相加时,从低位到高位,各位数字分别相加,然后对相加后的数和10进行整除和求余运算,整除之后的值为进位,而余数就等于所求数之和。不断重复,直到最高位为止。 2.2.3超长整数减法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定差的位数设LA为A的位数,LB为B的位数,则两数之差的位数最大为较大数的位数,即如果LALB,则差的位数最大为LA。3、借位处理做减法运算时,要先判断是否需要借位,如果需要借位,从上一位借过一个10,上一位的数减去1,处理

12、完之后再相减。2.2.4 超长整数乘法运算1、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为A和B,利用字符串函数把字符串转化为数值,将A、B中的每一位数字分别存储在A、B两个数组中,最低位在第一个单元中。2、确定积的位数设LA为A的位数,LB为B的位数,乘积的位数最多为LA+LB,最少为LA+LB-1。所以,乘积的位数上限为LA+LB。3、算法首先计算被乘数与乘数的个位数字的乘积,把结果保存到积数组中,然后再用被乘数去乘以乘数的十位数字,把结果退一位加到积数组中。每加一次乘积结果就进行一次进位处理,其方法与加法中的进位处理一样。 超长整数的整除及求余运算1、数据的接收和存储采

13、用字符串输入的方式,设参与运算的两个数分别为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:=j-1,即令B1.n缩小10倍。第三章 详细设计3.1 超长整

14、型数据的输入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=

15、-1;fb=0; for (i=0; ilena; i+,fa+) a1i=b1lena-fa-0; /*把字符形数据b1转为整数形数据,同样用数组纪录*/ for (i=0; i0|f) if(lenalenb) s=lena; else s=lenb; /*用s纪录结果的最大位数*/ for(i=0;is;i+) ci=ai+bi+ci; ci+1=(int)ci/10; /*ci+1代表进位*/ ci=(int)ci%10; /*超长整数加法运算过程*/ if(cs) s+; /*判断最后结果的位数*/ if(da0&f|da=0;i-) printf(%d,ci); /*输出结果*/

16、else jianfa(a,b,1);3.3 超长整数的减法void jianfa(int a,int b,int f) /*超长整数减法运算*/ int i,u=0,cMAX+1=0,s; if(da*db0|f) if(lenalenb) s=lena; else /*用s纪录结果的最大位数*/ s=lenb; for(i=s;ai=0;i-) if(aibi) u=1; /*u纪录结果符号*/ if(!u) /*超长整数减法运算过程*/ for(i=0;is;i+) if(aibi) ai+1-; ai+=10; ci=ai-bi; else /*当ab时的处理*/ for(i=0;is

17、;i+) if(bi1) s-; /*判断最后结果的位数*/ if(f&(da0&u|da0&(db0&u|u&!f) printf(-); if(da0&db=0;i-) printf(%d,ci); else jiafa(a,b,1);3.4 超长整数的乘法void chengfa( int a, int b) /*超长整数乘法运算*/ int i, j, c2*MAX = 0,s; s = lena + lenb - 1; /*用s纪录结果的最大位数*/ for(i = 0; i lena; i+) /*超长整数乘法运算过程*/ for(j = 0;j lenb; j+) ci+j =

18、ai * bj + ci+j; ci+j+1 = ci+j / 10 + ci+j+1; ci+j = ci+j % 10; while(!cs) s-; /*判断最后结果的位数*/ if(da*db= 0; i-) printf(%d,ci); /*输出结果*/3.5 超长整数的整除及求余/比较两个用字符串存储的超长正整数的大小,若ab,返回1;a=b,返回0;a lenB ? 1 : -1;else return strcmp(a,b);/超长正整数的减法,且被减数大于减数void cha(char *beijian, char *jian, char *chas)int cBMAX =

19、0;/用来存储被减数的整型数组int cJMAX = 0;/用来存储减数的整型数组int cCMAX = 0;/用来存储两数之差的整型数组int lenM = strlen(beijian), lenS = strlen(jian);/被减数和减数字符串的长度int i;/逆序复制减数和被减数到整型数组(因为减法运算是从低位开始),保证cB大于cJ for (i=0; ilenM; i+) cBi = beijianlenM-1-i - 0; for (i=0; ilenS; i+) cJi = jianlenS-1-i - 0;for (i=0; i= cJi)/被减数大于减数,直接相减 c

20、Ci = cBi - cJi; else /否则要向前借位 cCi = cBi + 10 - cJi; -cBi+1; while (cCi-1 = 0) i-;int j = 0;int k;for (k=i-1; k=0; k-,j+)/逆序存储两数之差到字符串chas chasj = cCk + 0;chasj = 0;/超长整型数据的整除,求余运算void chufa(char *beichu, char *chu, char *shang, char *yu) int lenv=strlen(beichu),lens=strlen(chu);if(beichu0=-)da=-1; /

21、判断数组的符号 for(int i=0;ilenv;i+) beichui=beichui+1; lenv-;if(chu0=-)db=-1; for(int i=0;ilens;i+) chui=chui+1; lens-;if (Compare(beichu, chu) = 0)/被除数等于除数 strcpy(shang, 1); strcpy(yu, 0); return ;if (strcmp(chu, 0) = 0 | Compare(beichu, chu) = 0)/连减试商 s+; cha(yu, chu, yu); shangk+ = s + 0;/记录每一位得到的商值 if

22、 (strcmp(yu, 0) = 0) strcpy(yu, ); /使余数的值为空,去掉多余的0shangk = 0; /去掉多余的0int j;for (i=0; shangi=0; i+) ;for (j=i; j=k; j+) shangj-i = shangj; 第四章 设计结果及分析4.1 设计概述在不大于10101-1的整数范围内进行存储与运算,有必要对数据的正负性进行判断,因而程序在总体上应包含正整数与负整数的存储与运算。正负性的判断与运算是本程序体系结构设计的核心。同样对数据的整除求余运算也同样是本设计的一个难点,因为在整除求余运算中采用的是竖式计算的方法,当中还调用了减法

23、的子函数,无论是设计还是运算都比较复杂。4.2 设计约束本程序必须实现对在10101-1范围内的所有超长整数的存储与运算,超出这个数据范围则程序停止运行。4.3 运行流程1、输入数据2、数据存储3、条件判断4、进行运算5、输出结果总 结此次课程设计对于我个人来说具有很重大的意义,我学到了很多关于数据存储与运算方面的知识,掌握了一些课程设计的方法与思想,了解了毕业设计的一些制作流程,同时这也是我第一次参加团队项目设计,它不仅锻炼了我的思维以及程序开发能力,也使我充分认识到了团队合作的重要性,为我以后的求学之路打下了深厚的基础。在此次编程开发过程中我深刻地体会到了自学能力的重要性。毕竟平时在课堂上

24、学到的东西都是有限的,而且也只是一味的去接受,并不能主动地去思考,其实在真正的设计实践过程中还需要我们不断的去努力去学习,才能使该程序完成预期的目标。在本次课程设计中我花费了大量的时间借助图书和网络查阅了很多的相关资料,并和身边的同学进行了反复的讨论与研究,经过不断的思考和改进,初步完成了超长整型数据的存储与运算的设计目标,用于解决实际问题。由于我自身的学识有限,加之时间比较仓促,使得此程序可能存在某些不足之处,真诚的欢迎老师、同学提出宝贵的意见,我将认真听取、改正努力提高自己。致 谢在课程设计完成之际,我首先要向指导老师张岗亭表示最真挚的谢意。张老师认真负责的工作态度,严谨的治学精神和深厚的

25、理论水平都使我收益匪浅。无论在理论上还是在实践中,都给予了我们很大的帮助,使我得到不少的提高,这对于我们以后的工作和学习都是一种巨大的帮助,感谢他耐心的辅导。感谢系里给予的这次课程设计实践机会,感谢院系领导们和老师们的关心与帮助。同时还要感谢08级软件工程(2)班所有同学给予我的帮助,感谢我们这个小组的协同合作,正是有了这些帮助才使得我能够顺利的完成这次的课程设计。参考文献1 吴金平.Visual C+ 6.0编程与实践M.北京:中国水利水电出版社,20042 官章权.Visual C+ 6.0高级编程范例M.北京:电子工业出版社,20023 王萍. C+面向对象程序设计M.北京:清华大学出版

26、社,2002 4 杨路明等. C/C+程序设计教程M. 湖南:湖南科技出版社,20015谭浩强.C程序设计(第三版)M .北京: 清华大学出版社, 20106严蔚敏吴伟民数据结构 M 北京: 高等教育出版社,2004附录#include #include #include #include#define MAX 101void jianfa(int a,int b,int f); / 函数功能:利用字符串实现超长整数减法运算int lena,lenb,da=1,db=1; /* 把lena,lenb设为全局变量,lena纪录第一个超长整型数组的位数,lenb纪录第二个超长整型数组的位数*/ch

27、ar b1MAX, b2MAX; /*纪录需要计算的两个超长整型数据 */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;

28、/*判断数组的符号*/ if(b20=-) lenb-; db=-1;fb=0; for (i=0; ilena; i+,fa+) a1i=b1lena-fa-0; /*把字符形数据b1转为整数形数据,同样用数组纪录*/ for (i=0; i0|f) if(lenalenb) s=lena; else s=lenb; /*用s纪录结果的最大位数*/ for(i=0;is;i+) ci=ai+bi+ci; ci+1=(int)ci/10; /*ci+1代表进位*/ ci=(int)ci%10; /*超长整数加法运算过程*/ if(cs) s+; /*判断最后结果的位数*/ if(da0&f|d

29、a=0;i-) printf(%d,ci); /*输出结果*/ else jianfa(a,b,1); void jianfa(int a,int b,int f) /*超长整数减法运算*/ int i,u=0,cMAX+1=0,s; if(da*db0|f) if(lenalenb) s=lena; else /*用s纪录结果的最大位数*/ s=lenb; for(i=s;ai=0;i-) if(aibi) u=1; /*u纪录结果符号*/ if(!u) /*超长整数减法运算过程*/ for(i=0;is;i+) if(aibi) ai+1-; ai+=10; ci=ai-bi; else

30、/*当ab时的处理*/ for(i=0;is;i+) if(bi1) s-; /*判断最后结果的位数*/ if(f&(da0&u|da0&(db0&u|u&!f) printf(-); if(da0&db=0;i-) printf(%d,ci); else jiafa(a,b,1);void chengfa( int a, int b) /*超长整数乘法运算*/ int i, j, c2*MAX = 0,s; s = lena + lenb - 1; /*用s纪录结果的最大位数*/ for(i = 0; i lena; i+) /*超长整数乘法运算过程*/ for(j = 0;j lenb;

31、j+) ci+j = ai * bj + ci+j; ci+j+1 = ci+j / 10 + ci+j+1; ci+j = ci+j % 10; while(!cs) s-; /*判断最后结果的位数*/ if(da*db= 0; i-) printf(%d,ci); /*输出结果*/ /比较两个用字符串存储的超长正整数的大小,若ab,返回1;a=b,返回0;a lenB ? 1 : -1;else return strcmp(a,b);/超长正整数的减法,且被减数大于减数void cha(char *beijian, char *jian, char *chas)int cBMAX = 0;

32、/用来存储被减数的整型数组int cJMAX = 0;/用来存储减数的整型数组int cCMAX = 0;/用来存储两数之差的整型数组int lenM = strlen(beijian), lenS = strlen(jian);/被减数和减数字符串的长度int i;/逆序复制减数和被减数到整型数组(因为减法运算是从低位开始),保证cB大于cJ for (i=0; ilenM; i+) cBi = beijianlenM-1-i - 0; for (i=0; ilenS; i+) cJi = jianlenS-1-i - 0;for (i=0; i= cJi)/被减数大于减数,直接相减 cCi

33、 = cBi - cJi; else /否则要向前借位 cCi = cBi + 10 - cJi; -cBi+1; while (cCi-1 = 0) i-;int j = 0;int k;for (k=i-1; k=0; k-,j+)/逆序存储两数之差到字符串chas chasj = cCk + 0;chasj = 0;/超长整型数据的整除,求余运算void chufa(char *beichu, char *chu, char *shang, char *yu) int lenv=strlen(beichu),lens=strlen(chu);if(beichu0=-)da=-1; /判断

34、数组的符号 for(int i=0;ilenv;i+) beichui=beichui+1; lenv-;if(chu0=-)db=-1; for(int i=0;ilens;i+) chui=chui+1; lens-;if (Compare(beichu, chu) = 0)/被除数等于除数 strcpy(shang, 1); strcpy(yu, 0); return ;if (strcmp(chu, 0) = 0 | Compare(beichu, chu) = 0)/连减试商 s+; cha(yu, chu, yu); shangk+ = s + 0;/记录每一位得到的商值 if (

35、strcmp(yu, 0) = 0) strcpy(yu, ); /使余数的值为空,去掉多余的0shangk = 0; /去掉多余的0int j;for (i=0; shangi=0; i+) ;for (j=i; j=k; j+) shangj-i = shangj;void main() int aMAX=0,bMAX=0; input(a,b); printf(n两者之和:n,b1,b2);jiafa(a,b,0); printf(n两者之差:n,b1,b2);jianfa(a,b,0); printf(n两者之积:n,b1,b2);chengfa(a,b); printf(n); getchar();char cMAX = 0, dMAX = 0; chufa( b1, b2,c,d); puts(两者之商:); if(da*db0&strcmp(c,0) printf(-); puts(c); puts(余数:); puts(d);system(pause);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!