【发布时间】:2013-01-25 16:12:22
【问题描述】:
我正在尝试解决 C# 中的 the biggest prime 编程实践问题。 问题很简单,打印出来或者写入文件号: 257,885,161 - 1(有 17,425,170 位)
我已经设法使用惊人的GNU Multiple Precision Arithmetic Library 到Emil Stevanof .Net wrapper 解决了这个问题
var num = BigInt.Power(2, 57885161) - 1;
File.WriteAllText("biggestPrime.txt", num.ToString());
即使当前发布的所有解决方案都使用这个库,对我来说这感觉就像在作弊。有没有办法在托管代码中解决这个问题?想法?有什么建议吗?
PS:我已经尝试过使用 .Net 4.0 BigInteger,但它永远结束计算(我等了 5 分钟,但与 GMP 解决方案的 50 秒相比已经很多了)。
【问题讨论】:
-
我只是指出5分钟不是never
-
BigInteger.ToString()方法对于大数字非常很慢。另外我不太明白他们为什么选择将BigInteger设为值类型,因为它的底层数组可能会占用很多兆字节。 -
@Blachshma 我知道,这就是为什么 never 是斜体的 :) 顺便说一句,我在发布后让它运行,1 个多小时后它仍在计算。
-
@JeppeStigNielsen 为什么它是一个值类型很重要?复制
BigInteger意味着只复制 reference 到(可能是巨大的)数组,而不是复制整个数组。 -
@svick 在二进制中,它只是
57885161的序列。所以你需要做的就是找出第一个十六进制数字和后面的fs 的数量。从57885161 = 1 (mod 4)开始,第一个数字是1,后面是fs的个数是57885161 / 4 = 14471290。
标签: c# algorithm numbers primes