多精度数的四则运算-Java和Python实现

多精度数指的是位数超过1024Bit的数。由于这一类数的位数超过了计算机CPU寄存器表达,也就是超出了计算机的字长,所以不能够使用计算机进行直接的运算。除此之外,多精度数的大小也超出了计算机中定义的整型变量的最大大小,所以也不能使用标准的整型来存储这一类数,而需要使用数组或是字符串来存储。 对于多精度数的计算,目前有两种处理办法: 模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。 这个方法的优点是操作逻辑符合人们的日常思维,易于理解,缺点是效率较低。 将多精度数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算。 这个方法的优点是执行效率高,缺点是代码极其复杂,可读性低,难以理解。 下面的算法都是基于第一种办法进行处理。 算法原理 先重新理一下竖式计算的流程: 加法在手工竖式计算中,当两个位相加得到的值大于10时就会产生一个进位值,并会在高一位的计算中把进位值也加入计算,这样从低位到高位一直计算直到计算结束为止。所以在算法中也需要定义一个进位值的变量。 减法与加法类似,当被减数位小于减数位时,会产生一个退位值,即向更高一位去借10,来避免产生负数。若这一位产生了借位,那么高一位的计算中就要减去1再进行计算。所以在算法中也需要定义一个退位值的变量。 乘法的运算在竖式计算中是把乘数逐位的与被乘数相乘,且运算结果随着乘数的位数向左移,最后再全部相加。所以在对单个结果位的处理中要考虑到三个因素:第一个是当前的计算结果;第二个是前一位产生的进位;第三个是之前的计算中在这一位得出的结果。 除法在竖式运算中可以理解为是多次的减法。下图展示了除法算法的流程: 模指数运算 除此之外,还有多精度数的模指数运算,即计算以下式子的值: $$\Large{a^e\space mod\space m} $$ 可采用重复平方乘算法来实现: 算法实现 理解了竖式计算的流程与规则后,就可以使用算法进行实现了。由于课程实验原因,我做了Java和Python两个语言的版本,其中Java里面使用了ArrayList对数进行存储,Python中则使用了列表List进行存储。 Java: // 导入对应模块 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class BigNum { /** * 此方法用于快速创建一个存储有多精度整数的ArrayList对象 * 参数 elements 为整个整数的每一位数字 * 返回 ArrayList<Integer> */ public static ArrayList<Integer> createArrayList(int ... elements) { ArrayList<Integer> list = new ArrayList<Integer>(); for (Integer element : elements) { list.add(element); } return list; } /** * 此方法用于比较两个数的大小。若第一个数大于等于第二个数则返回true,否则返回false * 参数 num1, num2 为要比较的数 * 返回比较结果 boolean */ public static boolean isBigger(ArrayList<Integer> num1, ArrayList<Integer> num2) { if(num1....

Nov. 10, 2019 · 6 min · 1088 words

CentOS服务器上安装Python3.7并设置为默认Python

最近由于课程设计要求要在服务器上配置Flask框架,但是我在配置的时候各种报错搞不来,搜了一番之后发现是默认Python版本是2.7导致的。然后我尝试去运行Python3,发现服务器上压根没有……于是……就有了这篇文章 注:本文转载自https://blog.csdn.net/weixin_41216356/article/details/99819899 0x00 引言 Linux操作系统自带一个Python2.7,没有Python3,在开发的时候非常不便,因此需要安装一个Python3,并且将Python3设置系统默认Python,同时还不能影响那些Linux系统中需要用Python2的底层文件。 0x01 安装Python3 查看操作系统及Python基本信息 首先查看一下系统的版本以及Python信息,各系统查看信息的方法参考:https://www.cnblogs.com/wzk-0000/p/7483262.html cat /etc/redhat-release # 查看内核版本 python -V # 查看python版本 which python # 查看python路径 我这边的系统的内核为CentOS 7,默认Python的版本为2.7.5,路径为/usr/bin/python。 然后我们导航到该目录,查看Python相关文件的信息,可以看到Python和Python2指向的都是Python2.7。 [root@libra-server ~]# cd /usr/bin [root@libra-server bin]# ll python* # 查看以python开头的文件信息 lrwxrwxrwx. 1 root root 7 Oct 15 2017 python -> python2 lrwxrwxrwx. 1 root root 9 Oct 15 2017 python2 -> python2.7 -rwxr-xr-x. 1 root root 7136 Aug 4 2017 python2.7 安装依赖包(编译,安装程序等所需) yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel yum -y install readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum -y install libffi-devel 如果是RedHat/CentOS平台,用yum install;如果是Ubuntu/Debian平台,用apt-get install。...

Nov. 1, 2019 · 3 min · 536 words

Python爬虫学习总结

网络爬虫的流程和原理 整个网络爬虫的流程可以分为如下的三个步骤: 整个爬虫的过程都可以使用 Python(本文使用 Python 3)来完成,每个步骤使用的模块大致如下: 获取网页:requests、urllib、selenium(模拟浏览器) 解析网页:re正则表达式、BeautifulSoup、HTML 解析器lxml等 存储数据:存储至 txt、csv 等文件或是存储至 MySQL、MongoDB 等数据库 使用 requests 模块发起 HTTP 请求与抓取静态网页 使用 pip 命令安装requests模块。 pip install requests 使用requests.get()可以向目标 URL 发送一个GET请求并返回页面内容与信息。 import requests r = requests.get('https://www.baidu.com') 此时我们就已经实现了一个静态网页的抓取。requests.get()方法返回的对象包含了关于本次请求的信息,通过它的一些实例变量和方法可以进行访问。下面列出了一些常用的变量和方法: status_code :返回 HTTP 状态码 headers :返回请求头 encoding :返回编码类型 text :返回响应内容(Unicode) content :返回响应内容(二进制数据) json() :返回 JSON 响应内容 url :返回网页 URL 上面只是一个所有参数都为默认时的请求。有时候我们可以对requests进行定制,使得请求符合我们的需求。 设置 URL 参数 可以使用一个字典用于保存参数名称与其对应的值,然后通过params参数传入requests.get()方法中。在下面的代码中,将值为value1的参数key1和值为value2的参数key2传入网页http://httpbin.org/get,发现 URL 已经正确编码: import requests key = {'key1': 'value1', 'key2': 'value2'} r = requests....

Sep. 27, 2019 · 11 min · 2188 words