.net中大数处理的一些算法思想
2006-02-18 02:31
260 查看
在 .NET 开发中,有时会因为处理一些边缘学科的知识内容,如统计,金融,天文等计算,是加密解密算法
都会涉及到大数的运算,就是.net中最大数值类型储存了都会溢出的数,我的一个想法是计算时用数值类型,储
存(暂时)和输出时是字符串 那么储存时就需要BOX
n个数组来暂时储存一个计算中的小步骤结果,
'如一下例子
======================算法理解图=======================
'97*97*97*97*97 = 8587340257 box(1) = 587340257 box(2)=8
'97*97*97*97*97*97 = 832972004929 box(1) = 972004929 box(2)=832
'97*97*97*97*97*97*97 = 80798284478113 box(1) = 284478113 box(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 box(1) = 594376961 box(2)=7837433
'97^ 9 = 760231058654565217 box(1) = 654565217 box(2)=760231058
'97^ 10 = 73742412689492826049 box(1) = 492826049 box(2)=742412689 box(3)=73
…… …… …… ……
注意box 下标越大对应的数越高位在,在运用上面的算法时要记住
①先定义一个BOX的标志为几位,如上面是9位(根据需要和实际情况),
②由于计算习惯,很多人会从底位算起时{box(0 -> n)} 要先算box(n+1)位的数,在把box(n) 产生的进位数(如第一条计算box(1)向box(2)=0产生进位数8 box(2)+进位数 = 8 )进行处理,如以上时加法处理
③ 最好从高位算起,你将省去很多麻烦,box个数未知,没关系,用动态数组,满了时(最高下标box产生的进位数)再添一个
还有取模运算时,如果模数不大,也可以采用以上思想分段求模,再链接box得暂时结果,重新分配box(一定要从高位起重新截断)如被模数123456789123456789 设八位一个box box(1)=89 box(2)=91234567 box(3)=12345678各box分别取模再联合(传统是123456789123456789 ÷ 333=370741108478849 模是72) 那么重新分配的盒子应该是box(1) =478849 box(2) =370741180 而不能是box(1) =370741180 box(2) = 478849 为什么? ∵从高位开始取模,box(n) 在被取模一次后如果不变,再次取模结果没变是box(n) = box(n) 程序将进入死循环
另外一种涉及大数运算的情况式是 对A的n 次方后取模 (A ^n mod V ) 如果mod数不大可以(是n个A后结束)((A mod V)* A mod V) * A mod V …… 此算法不一定要用递归实现,简单的循环即可,最多两层嵌套循环
最后忠告 :对一个大数进行加减乘除时千万别轻易的进行对被(加/减/乘/除)数因式分解,这种算法效率会很底
(文章编写匆忙,可能存在错字,敬请原谅)
都会涉及到大数的运算,就是.net中最大数值类型储存了都会溢出的数,我的一个想法是计算时用数值类型,储
存(暂时)和输出时是字符串 那么储存时就需要BOX
n个数组来暂时储存一个计算中的小步骤结果,
'如一下例子
======================算法理解图=======================
'97*97*97*97*97 = 8587340257 box(1) = 587340257 box(2)=8
'97*97*97*97*97*97 = 832972004929 box(1) = 972004929 box(2)=832
'97*97*97*97*97*97*97 = 80798284478113 box(1) = 284478113 box(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 box(1) = 594376961 box(2)=7837433
'97^ 9 = 760231058654565217 box(1) = 654565217 box(2)=760231058
'97^ 10 = 73742412689492826049 box(1) = 492826049 box(2)=742412689 box(3)=73
…… …… …… ……
注意box 下标越大对应的数越高位在,在运用上面的算法时要记住
①先定义一个BOX的标志为几位,如上面是9位(根据需要和实际情况),
②由于计算习惯,很多人会从底位算起时{box(0 -> n)} 要先算box(n+1)位的数,在把box(n) 产生的进位数(如第一条计算box(1)向box(2)=0产生进位数8 box(2)+进位数 = 8 )进行处理,如以上时加法处理
③ 最好从高位算起,你将省去很多麻烦,box个数未知,没关系,用动态数组,满了时(最高下标box产生的进位数)再添一个
还有取模运算时,如果模数不大,也可以采用以上思想分段求模,再链接box得暂时结果,重新分配box(一定要从高位起重新截断)如被模数123456789123456789 设八位一个box box(1)=89 box(2)=91234567 box(3)=12345678各box分别取模再联合(传统是123456789123456789 ÷ 333=370741108478849 模是72) 那么重新分配的盒子应该是box(1) =478849 box(2) =370741180 而不能是box(1) =370741180 box(2) = 478849 为什么? ∵从高位开始取模,box(n) 在被取模一次后如果不变,再次取模结果没变是box(n) = box(n) 程序将进入死循环
另外一种涉及大数运算的情况式是 对A的n 次方后取模 (A ^n mod V ) 如果mod数不大可以(是n个A后结束)((A mod V)* A mod V) * A mod V …… 此算法不一定要用递归实现,简单的循环即可,最多两层嵌套循环
最后忠告 :对一个大数进行加减乘除时千万别轻易的进行对被(加/减/乘/除)数因式分解,这种算法效率会很底
(文章编写匆忙,可能存在错字,敬请原谅)
相关文章推荐
- .net中大数处理的一些算法思想
- .net中大数处理的一些算法思想
- .net中大数处理的一些算法思想
- linux内核使用的一些算法和思想(个人总结)
- 图像处理基本思想和算法研究
- 求二维平面最近点对算法; 分治思想; 递归写的好精准,模仿ACM模板写的.;很多细节处理的很漂亮;
- 一些图像处理算法
- 各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。
- 信号处理算法方向的一些SCI杂志(他人经验)
- [数据结构]一些常见的算法思想
- 信号处理算法方向的一些SCI杂志(他人经验)
- Java开发岗面试中的一些算法题和思想
- 递归算法思想&&一些简单算法实现
- 计算机视觉一些简单图片处理算法
- 一些图像处理相关的常用算法链接地址
- 自己项目中的一些算法处理
- 大数据处理的一些思想
- 一些算法思想
- 音频处理与压缩的一些技术点和算法
- [数据结构]一些常见的算法思想