大整数的运算
【问题描述】
密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/解密,而
非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把加密的数
据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算等,同时,
还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除和指数运算,
以及大整数的输入和输出。
【基本要求】
1.要求采用链表来实现大整数的存储和运算,不允许使用标准模板类的链表类(list)和函
数。同时要求可以从键盘输入大整数,也可以文件输入大整数,大整数可以输出至显示
器,也可以输出至文件。大整数的存储、运算和显示,可以同时支持二进制和十进制,
但至少要支持十进制。大整数输出显示时,必须能清楚地表达出整数的位数。测试时,
各种情况都需要测试,并附上测试截图;要求测试例子要比较详尽,各种极限情况也要
考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确;
2.要求大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为十几位的整
数,也可以为500多位的整数,甚至更长;大整数的运算和显示时,只需要考虑正的大
整数。如果可能的话,请以秒为单位显示每次大整数运算的时间;
3.要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。主函数中只
能出现类的成员函数的调用,不允许出现对其它函数的调用。
4.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存
储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。
5.不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释;
【实现提示】
1.大整数的加减运算可以分解为普通整数的运算来实现;而大整数的乘、除和指数运算,
可以分解为大整数的加减运算。
2.大整数的加、减、乘、除和指数运算,一般是在求两大整数在取余操作下的加、减、乘、
除和指数运算,即分别求(a+b)modn,(a-b)modn,(a*b)modn,(a/b)modn和(a^b)
modn。其中a^b是求a的b次方,而n称之为模数。说明:取余操作(即mod操作)
是计算相除之后所得的余数,不同于除法运算的是,取余操作得到的是余数,而不是除
数。如7mod5=2。模数n的设定,可以为2m或10m,m允许每次计算时从键盘输
入。模数n的取值一般为2512(相当于十进制150位左右),21024(相当于十进制200~300
位),22048(相当于十进制300~500位)。为了测试,模数n也可以为2256,2128等值。
3.需要设计主要类有:链表类和大整数类。链表类用于处理链表的相关操作,包括缺省构
造函数、拷贝构造函数、赋值函数、析构函数、链表的创建、插入、删除和显示等;而
大整数类则用于处理大整数的各种运算和显示等。
【运行结果要求】
要求能实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出,实验报告
要求有详细的设计思路、功能测试截图。
源码:
百度链接:https://pan.baidu.com/s/1xaSJSxDELF5T-v6AkTnvxA?pwd=fs5d
提取码:fs5d