最近完成了数据结构的课程设计,课程设计的题目选择的是大数运算,写这篇博客是为了总结一下,也希望能够帮到需要的人。
一、实验题目
密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/ 解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把 加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算 等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除 和指数运算,以及大整数的输入和输出。
二、大数储存
对于大数的储存,采用的是链表(反向储存,如123在链表内储存为321),这样处理可使得大数可以使得大数拥有百位长或者千位长。对于链表的每一个节点,我采用的是储存一位数(注意,这里储存位数是可以多位的,我开始思考太简单,只采用了一位数,实际上这样效率不高,这在我实现了一部分代码后才意识到)。同时,链表用自定义链表,未使用c++库里封存的链表。
三、计算实现(以十进制运算为例,对于二进制运算,其实现原理一致,只是利用其只有0或者1的特点简化运算)
1)对于加法,减法,乘法的实现(只是简单的列竖式方式的实现,实现原理与列竖式原理一致)
2)对于除法的实现
原理采用连续相减,为简化加强效率,在除数后面补0,直至与被除数位数相同,这样目的是为减少减法次数。在减不下来时去掉除数增加的0,再次相减,直至去完增加的0;
3)余数实现(原理与除法思想一致)
4)指数运算
简化原理
例如:2^1024
1、以2为底数,计算2^4
2、以2^10为底数,计算(2^10)^2
3、以2^10为底数,计算(2^100)^0
4、以2^10为底数,计算(2^1000)^1
5、上述所有结果相乘
实验代码在csdn博客上,
代码地址 https://blog.csdn.net/qq_43646059/article/details/104372038
网友评论