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

多精度数指的是位数超过1024Bit的数。由于这一类数的位数超过了计算机CPU寄存器表达,也就是超出了计算机的字长,所以不能够使用计算机进行直接的运算。除此之外,多精度数的大小也超出了计算机中定义的整型变量的最大大小,所以也不能使用标准的整型来存储这一类数,而需要使用数组或是字符串来存储。 对于多精度数的计算,目前有两种处理办法: 模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。 这个方法的优点是操作逻辑符合人们的日常思维,易于理解,缺点是效率较低。 将多精度数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算。 这个方法的优点是执行效率高,缺点是代码极其复杂,可读性低,难以理解。 下面的算法都是基于第一种办法进行处理。 算法原理 先重新理一下竖式计算的流程: 加法在手工竖式计算中,当两个位相加得到的值大于10时就会产生一个进位值,并会在高一位的计算中把进位值也加入计算,这样从低位到高位一直计算直到计算结束为止。所以在算法中也需要定义一个进位值的变量。 减法与加法类似,当被减数位小于减数位时,会产生一个退位值,即向更高一位去借10,来避免产生负数。若这一位产生了借位,那么高一位的计算中就要减去1再进行计算。所以在算法中也需要定义一个退位值的变量。 乘法的运算在竖式计算中是把乘数逐位的与被乘数相乘,且运算结果随着乘数的位数向左移,最后再全部相加。所以在对单个结果位的处理中要考虑到三个因素:第一个是当前的计算结果;第二个是前一位产生的进位;第三个是之前的计算中在这一位得出的结果。 除法在竖式运算中可以理解为是多次的减法。下图展示了除法算法的流程: 模指数运算 除此之外,还有多精度数的模指数运算,即计算以下式子的值: $$\Large{a^e\space mod\space m} $$ 可采用重复平方乘算法来实现: 算法实现 理解了竖式计算的流程与规则后,就可以使用算法进行实现了。由于课程实验原因,我做了Java和Python两个语言的版本,其中Java里面使用了ArrayList对数进行存储,Python中则使用了列表List进行存储。 Java: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 // 导入对应模块 import java....

Nov. 10, 2019 · 8 min · 1531 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 1 2 3 cat /etc/redhat-release # 查看内核版本 python -V # 查看python版本 which python # 查看python路径 我这边的系统的内核为CentOS 7,默认Python的版本为2.7.5,路径为/usr/bin/python。 然后我们导航到该目录,查看Python相关文件的信息,可以看到Python和Python2指向的都是Python2.7。 1 2 3 4 5 6 [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....

Nov. 1, 2019 · 3 min · 606 words

Python爬虫学习总结

网络爬虫的流程和原理 整个网络爬虫的流程可以分为如下的三个步骤: 整个爬虫的过程都可以使用 Python(本文使用 Python 3)来完成,每个步骤使用的模块大致如下: 获取网页:requests、urllib、selenium(模拟浏览器) 解析网页:re正则表达式、BeautifulSoup、HTML 解析器lxml等 存储数据:存储至 txt、csv 等文件或是存储至 MySQL、MongoDB 等数据库 使用 requests 模块发起 HTTP 请求与抓取静态网页 使用 pip 命令安装requests模块。 1 pip install requests 使用requests.get()可以向目标 URL 发送一个GET请求并返回页面内容与信息。 1 2 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 已经正确编码: 1 2 3 4 5 import requests key = {'key1': 'value1', 'key2': 'value2'} r = requests....

Sep. 27, 2019 · 13 min · 2728 words