美文网首页
2020-02-21

2020-02-21

作者: 我的第三只手 | 来源:发表于2020-02-21 18:03 被阅读0次

    最近完成了数据结构的课程设计,课程设计的题目选择的是大数运算,写这篇博客是为了总结一下,也希望能够帮到需要的人。

      一、实验题目

         密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/ 解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把 加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算 等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除 和指数运算,以及大整数的输入和输出。

    二、大数储存

            对于大数的储存,采用的是链表(反向储存,如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

    相关文章

      网友评论

          本文标题:2020-02-21

          本文链接:https://www.haomeiwen.com/subject/ymqhqhtx.html