资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
安徽师范大学 通信工程专业 1 C 语言课程设计 课程设计课程设计报告报告 题目 大数乘法运算 学号 姓名 杰哥 年级专业 2011 级通信工程 指导教师 蔡继盛 完成日期 2012 年 6 月 1 日 安徽师范大学物理与电子信息学院 College of Physics and Electronic Information, Anhui Normal University 安徽师范大学 通信工程专业 2 1 1、课题背景及意义、课题背景及意义 随着计算机网络技术的发展和因特网的广泛普及,网络安全事 故逐年增加, 黑客的攻击已经和病毒并列成为对信息安全影响最严重 的两大危害。 其很大程度上是被黑客破解了用户的计算机名及登陆密 码及资料的加密较差, 而使得黑客来对网民的资料如同自己般的随意 更改和破坏。而安全的密码和账号成为了网民的安全之本,怎么才能 提高安全问题成为的人们和社会关注的问题。 而加密大部又是以大素 数的计算为基础的, 如非对称密码体制 RSA 的安全性依赖于对大数进 行因数分解的耗时性。 大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生 物学,化学等科目中。大数运算,意味着参加的值和计算结果通常是 上百位数,上千位数以及更大长度之间的整数运算。例如大家所熟知 圆周率的值,在一般的数值计算中用到圆周率的不须要多大的精 度,但在计算一些星球或是星系上的体积面积时便显的误差很大了, 这就要求值计算的精度达到几百万位甚至更高,才能缩小误差。人 工计算是远远不行了,而且本身误差也无法估计。只有在计算机中用 大数运算求值了。又如,考古学家计算石头内的碳元素衰变来考证 地球形成的时间,更是将计算的结果精确到了百年以内。所以说大数 的运算是涉及领域多,应用范广,与我们生活息息相关。 C 语言课程设计是一门实践性的计算机课程,为了学好这门 课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目 的就是要达到理论与实际应用相结合, 使同学们能够根据 C 语言的特 安徽师范大学 通信工程专业 3 点,学会软件设计的方法,能把现实世界中的实际问题在计算机内部 表示出来,并培养基本的、良好的软件设计技能。 通过这次课程设计,要求掌握软件的设计方法,相应数据结构的 选择应用、 算法的设计及其实现和性能分析等方面中加深对课程基本 内容的理解。同时,在软件设计方法以及上机操作等基本技能和科学 作风方面受到比较系统和严格的训练。 2 2、目的要求:、目的要求: 在教师指导下,学生根据选定的课题,综合运用所学程序设计的 知识,完成问题分析、模块设计、代码编写、程序调试和运行等训练 任务。 通过课程设计,初步锻炼运用所学基础知识解决实际问题的能 力,掌握软件开发的基本过程和基本方法以及良好的编程风格,培养 在软件开发中相互合作的团队意识。 3 3、 课题要求课题要求 1、用一个整型数组表示一个大数,数组的每个元素存储大数的 一位数字,则实际的大数 d 表示为: d=ak10k-1+ak-110k-2+a210+a1 其中 a0保存该大数的位数。 2、实现两个大数相乘; 3、在此基础上实现两个大数相除。 4 4、设计目标、设计目标 安徽师范大学 通信工程专业 4 用数组表示每一个大数,同时实现大数相乘和两个大数相除 概要设计概要设计 1 1、 问题解决的思路概述问题解决的思路概述 首先是确定结构化程序设计的流程图,利用已存在的数据结构 来构造一个存储大数的结构, 接着把运算分成乘、 除两个主要的模块: 实现乘法的模块、实现除法的模块,然后各个模块里面还要分成若干 种情况来考虑并通过函数的嵌套调用来实现其功能。 最后, 编写 main 主函数以实现大整数的正确输入与正确输出, 调试程序并将不足的地 方加以修改。总而言之,就是先用自顶向下、逐步细化的设计方法来 分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法 来写出程序。 2 2、本程序下定义的相关函数本程序下定义的相关函数 1、void jia(char *ch1 , char *ch2 , char *ch3)/大数相 加函数,作用为将 ch1、ch2 之和存入 ch3 2、void cheng(char *ch1 , char *ch2 , char *ch3) /定义 函数 cheng 用来算乘法,ch1,ch2,ch3 分别是被乘数字符串、乘数 字符串、和结果字符串的首指针 4、void chu (char *ch1 , char *ch2 , char *ch3) 3、void Mod (char *ch1 , char *ch2); /*声明存储两个操作数的字符串 ch1,ch2 声明各个子函数*/ 安徽师范大学 通信工程专业 5 3 3、主程序的流程基函数调用说明主程序的流程基函数调用说明 1 1) 、主程序的简要流程图:主程序的简要流程图: 详细设计详细设计 1 1、数字存储的实现、数字存储的实现 大数计算的因数和结果精度一般是少则数十位,多则几万位。在 C 语言中定义的类型中精度最多只有二十多位,此次程序采取定义一 个结构体类型存贮的方式来存放大数符号。 2 2、 二则运算算法二则运算算法 main() 选择运算方式(*,/) 获取大数(字符型) 将字符型大数转换成所 定义的结构体类型大数 调用相应的运算程序进 行大数运算 输出的运算结果 结束 将返回的运算结果转换 成字符类型数据 安徽师范大学 通信工程专业 6 在大数二则运算的程序设计中, 每一部分都会调用一些其他其它函 数来辅助完成运算(例如:对结构体变量的初始化,比较两个数的大 小,将字符型数据转换成结构体类型数据和将结构体类型数据转换成 字符型数据等) ,在这里主要说明二则运算的程序设计,其它函数的 程序设计和具体调用关系请查看程序清单。 2.12.1 乘法运算的实现乘法运算的实现 初始化游标 i,j、字符串 ch1 和 ch2 的长度 len1,len2、结果字符 串的长度 len3、临时变量 temp、整形数组 num1 num2 num3,并将其 值全部初始化为 0,利用两次 for 循环将字符数组中的每个值都转化 为整型并存放至数组 num1、 num2 中对应的位置, 将数组 num1 和 num2 中的各位数字依次相乘并向前进位,结果存入数组 num3 中, 检测两 数相乘的结果的长度,并将各位转化为字符后存入字符串 ch3 中.在 字符串的最后添上结束标志0 程序如下: 安徽师范大学 通信工程专业 7 void cheng(char *ch1 , char *ch2 , char *ch3) /定义函数 cheng 用来算乘法,ch1,ch2, ch3 分别是被乘数字符串、乘数字符串、和结果字符串的首指针 int i , j , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , temp , num1LIMIT=0, num2LIMIT=0 , num3LIMIT=0; /*初始化游标 i,j、字符串 ch1 和 ch2 的长度 len1,len2、结果字符串的长度 len3、 临时变量 temp、整形数组 num1 num2 num3,并将其值全部初始化为 0*/ for (i=len1-1;i=0;i-) num1len1-1-i = ch1i - 48; for (i=len2-1;i=0;i-) num2len2-1-i = ch2i - 48; /*利用两次 for 循环将字符数组中的每个值都转化为整型并存放至数组 num1、 num2 中对应的位置*/ for (i=0;i= 10) temp = num3i+j/10; num3i+j %= 10; while (temp != 0) num3i+j += temp; temp = num3i+j/10; j +; /*将数组 num1 和 num2 中的各位数字依次相乘并向前进位,结果存入数组 num3 中*/ len3 = len1+len2; while (len3 1 for (i=0;i len2) return 1; if (len2 len1) return -1; /优先比较长度 for (i=0;i ch2i) return 1; if (ch1i = 0) len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 0 ? len1-len2-1 : 0; ch40 = 1; for (i=0;i #include #defineLIMIT 200 void jia(char *ch1 , char *ch2 , char *ch3)/大数相加函数, 作用为将 ch1、ch2 之和存入 ch3 int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1LIMIT=0 , num2LIMIT=0 , num3LIMIT=0; /定义两字符串的长度 len1,len2,游标 i,临时变量 tmp,初 始化整型数组 num1、num2、num3,所有成员全部为 0,以便后面的操作 for (i=len1-1;i=0;i-) num1len1-1-i = ch1i - 48; for (i=len2-1;i=0;i-) num2len2-1-i = ch2i - 48; /利用循环将字符串中的每个字符转化为整型后存入数组 num1, num2 i = 0 , tmp = 0 , len3 = len1 len2 ? len1 : len2; /将 len1 和 len2 中较大的值赋给 len3 while (i = 10) tmp = num3i/10; num3i %= 10; i +; /将 num1,num2 中的值按位相加并依次进位 if (tmp != 0) num3i = tmp; i +; /判断最高位是否有进 位,有则向前再进一位 len3 = i; for (i=len3-1;i=0;i-) ch3len3-1-i = num3i + 48; ch3len3 = 0; /将加得的结果还原为字符并存入 ch3,最后添加结束标志0 void jian (char *ch1 , char *ch2 , char *ch3) / 保证 ch1 ch2 : ch3 = ch1 - ch2 int i , tmp , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , num1LIMIT=0, num2LIMIT=0 , num3LIMIT=0; /定义两字符串的长度 len1,len2,游标 i,临时变量 tmp,初 始化整型数组 num1、num2、num3,所有成员全部为 0,以便后面的操作 for (i=0;i len2 ? len1 : len2; /将 len1 和 len2 中较大的值赋给 len3 while (i 1 for (i=0;i=0;i-) num1len1-1-i = ch1i - 48; for (i=len2-1;i=0;i-) num2len2-1-i = ch2i - 48; /*利用两次 for 循环将字符数组中的每个值都转化为整型并存 放至数组 num1、num2 中对应的位置*/ for (i=0;i= 10) temp = num3i+j/
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号