高精度 大整数 计算 模板优化方向
2016-03-28 11:29
288 查看
在此列出了优化方向,并在接下来的几篇博客中贴出每一个的代码。
前言:
大整数运算的核心思想是利用数组保存数据进行模拟运算,优化思想均是二分优化,还有一个小技巧优化。
1.加法add:利用数组按位相加,无优化。
2.减法sub:利用数组按位相减,无优化。
分两个版本,s1是判断两个减数的大小进行相应的求值并标明正负,s2是用在除法中,在两个减数大小判断做手脚,只判断正负即可。
3.乘法mul:m1每9个数字划分到一个新的数组当中,即10进制变成1e+9进制,时间复杂度由a*b优化为 a + b + ab/81;//a b 指的是两个字符串的位数。
m2当高精度乘以longlong范围内的数是无需优化,直接按位相乘。
4.除法division:利用1e+9进制,d1,两个高精度,试商,利用m2乘法和s2减法进行,试商2,4,6增长。
d2,高精度除以小整数,直接按位运算。
小整数除以高精度,直接得余数。
5.乘方运算:优化方向,二分优化,例如:a^11 = a^10*a = a^5*a^5*a是否字符串优化见第3条;
利用相同的得数减小运算量。
附:最大公因数利用辗转相除。
最小公倍数利用两数相乘除以最大公因素和或者其中一个因数自增。
模板见下文。
前言:
大整数运算的核心思想是利用数组保存数据进行模拟运算,优化思想均是二分优化,还有一个小技巧优化。
1.加法add:利用数组按位相加,无优化。
2.减法sub:利用数组按位相减,无优化。
分两个版本,s1是判断两个减数的大小进行相应的求值并标明正负,s2是用在除法中,在两个减数大小判断做手脚,只判断正负即可。
3.乘法mul:m1每9个数字划分到一个新的数组当中,即10进制变成1e+9进制,时间复杂度由a*b优化为 a + b + ab/81;//a b 指的是两个字符串的位数。
m2当高精度乘以longlong范围内的数是无需优化,直接按位相乘。
4.除法division:利用1e+9进制,d1,两个高精度,试商,利用m2乘法和s2减法进行,试商2,4,6增长。
d2,高精度除以小整数,直接按位运算。
小整数除以高精度,直接得余数。
5.乘方运算:优化方向,二分优化,例如:a^11 = a^10*a = a^5*a^5*a是否字符串优化见第3条;
利用相同的得数减小运算量。
附:最大公因数利用辗转相除。
最小公倍数利用两数相乘除以最大公因素和或者其中一个因数自增。
模板见下文。
相关文章推荐
- iOS的一些内存注意点
- [翻译] Autofac 控制范围和生命周期
- [ZZ]From QA to Engineering Productivity
- Android快速开发系列 10个常用工具类
- 手机上播放视频
- tomcat源代码解读
- mt7688编译mplayer
- android--显式跳转和隐式跳转的区别用法
- ios雷达脉冲效果
- 详说Swift 2.0中的错误处理
- [LeetCode]-algorithms-Longest Palindromic Substring
- 卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
- java动态代理(JDK和cglib)
- 斯坦福大学卷积神经网络教程UFLDL Tutorial - Convolutional Neural Network
- HDOJ 1754 I Hate It 线段树
- 深度学习教程Deep Learning Tutorials
- 卷积神经网络用于视觉识别Convolutional Neural Networks for Visual Recognition
- HDU1856 More is better(并查集)
- 一次app抓包引发的Android分析记录
- HDU 1103 Flo's Restaurant(模拟+优先队列)