我正在使用前26个素数的乘积。这需要超过52位的精度,我相信这是double可以处理的最大值,并且超过了小数可以提供的28-29位有效数字。那么对于这么大的数字执行乘法和除法会有什么策略呢?
此外,为了实现这一目标,我必须跳过什么样的环节会对性能产生什么影响呢?
前22个素数的乘积(我可以在我的计算器上加倍,而不会进入科学模式):
10,642,978,845,819,148,849,204,664,294,430
最后四个产品是
72,370,439
当相乘时,我得到:
7.7023705133964511682328635583552e+38
性能影响在这里尤为重要,因为我们基本上试图解决质数字符串比较解决方案在实践中是否比直接比较字符更快的问题。促使此调查的帖子是here。处理器针对浮点计算进行了优化;理想情况下,我希望在我最终得到的任何解决方案中充分利用这种优化。
TIA!
詹姆斯
PS:我所拥有的代码是竞争解决方案;我不认为素数解决方案可能会更快,但我试图给它最公平的机会。
答案 0 :(得分:6)
您可以在C#4.0中使用BigInteger。对于旧版本,我认为您需要一个开源库,例如this one
答案 1 :(得分:0)
我阅读了您关联的帖子,关于面试问题。由于您只是对这些大整数进行乘法和除法,因此巨大优化是将它们保持为素数因子形式。每个大整数是一个整数[0..25]的整数,每个元素代表分解中第n个素数的指数。要以这种形式乘以两个大整数,只需逐个元素地添加exponents;划分,减去指数。
但是你会发现这相当于在两个字符串上列出字符数。