在delphi里面怎么对一个45位的整型数进行运算啊(div mod等)?

violetfog 2002-04-02 03:30:21
我现在工作中做的一个程序是要对最大45位的整数进行基900取模(mod)。

但是很严重的问题是45位的数字早超过了int64的范围(in64最大为9e18),如果用double或者extended的浮点来做,就无法直接div和mod。如果用小数来乘900,似乎又不能得到正确的余数(只是近似值)

后来想过将45位拆分成三组来做,后面的不够从前面一组借一位(减法和除法思路一样)。写的时候才发现对15位以上来一个一个的借位的话,这个循环大的根本无法实现!
我彻底的想不通了----已经想了一天了。

一定有可行的方法只是我愚昧不知道而已。没办法,一直数学都不好。向各位大侠专家请教!!!越快答复越好!!!
...全文
131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChipHead 2002-04-03
  • 打赏
  • 举报
回复
首先到http://triade.studentenweb.org/GInt/gint.html下载FGInt库(Fast Gigantic Integer),这是一个大数运算库。

然后,在你的单元中引用它,写下以下的语句:
var
Digit1, Digit2, Digit3: FGInt;
begin
Base10StringToFGInt('13101381730138401398471384713041', Digit1); //10进制数字转换成FGInt
Base10StringToFGInt('103841034181034719784130413', Digit2);
FGIntDiv(Digit1, Digit2, Digit3); //FGInt除法
end;

还有很多函数,你可以自己查看一下源代码。这些函数的意义非常明显,应该不会由什么困难。
rwdx 2002-04-03
  • 打赏
  • 举报
回复
使用大型并行式计算机运算
violetfog 2002-04-03
  • 打赏
  • 举报
回复
BCB的想法是可行的。我已经写了程序,稍微复杂点,包括自身的一个嵌套。但还是比拆开做简单多了,而且说过,拆开做除法在性能上不可行,循环太大了!(思路要到过来,难怪开始都没想通)

根本不考虑放变量的问题。而是将原始数据做为字符串,然后从高位依次往下取一位,转成integer除900,不够则继续取一位,够则用余数加下一位继续除,直到除到最后的余数。

其实就是按我们笔算除法的顺序来做。这样想就好简单了。

集思广益,感谢大家的参与。不知道有没有比这种更简单的方法?
HiddingEye 2002-04-02
  • 打赏
  • 举报
回复
我没有做过。但是可不可以这样:
先把这个数值当作STRING;
把她拆开来,具体长度当然可以处理为好了!
拆好了 以后,STRTOINT(YOURSTRING);
然后自己处理,拆开后,自己做进位加也好,其他的也好啊。最后
在合并成很长的字副传输出就可以了。
我想当然的了。不知道可不可以啊!:-)
quark 2002-04-02
  • 打赏
  • 举报
回复
violetfog 2002-04-02
  • 打赏
  • 举报
回复
不懂,关键是被除数根本就放不到变量里面去(45位太大了)。只能拆开,但是拆开后的算法?

再说清楚一点。是将"124871270921734821659018273498231759867127349083"这样的数字(序列)求基于900进制的表达式,如:

Xn*900^n + X(n-1)*900^(n-1) +... +X2*900^2 + X1* 900

X是系数,^n是n次方。请教最理想的算法!
BCB 2002-04-02
  • 打赏
  • 举报
回复
实在不行,就编程模拟人的手工方式进行乘除

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧