类似
我在Java中编写了一个暴力解决方案,需要花费几个小时来运行,并产生了前500个大概数字,我认为应该足够了。但是,从190到210的答案似乎都不是正确的答案。
我想知道我在这里做错了什么,以及我如何优化它。可能问题出在BigInteger.isProbablePrime()
?
我不确定Stackoverflow是否是最好的问题,但我似乎陷入困境。我已经包含了我的代码和生成的数据。
如果有人给我一些提示或指示,我真的很感激。
编辑:我只是使用前500,000个素数再次运行程序;花了一天的时间来运行,但产生了正确的答案。
答案 0 :(得分:17)
我是Project Euler管理员。请不要发布可能破坏他人问题的信息,特别是代码和答案,甚至是半功能的代码。请相应地修改您的问题。编辑:谢谢你这样做!
求解者使用网络搜索有关解决问题的信息并不罕见,如果他们偶然发现这样的剧透,它会带来一些乐趣。 (是的,我知道有些网站有很多现成的解决方案,但至少它们通常用于降低编号的简单问题。)
我们有forums讨论问题的困难和提示,这些都是为剧透主义者进行了积极的编辑。
答案 1 :(得分:0)
难道你不应该想到一个不需要一天甚至一小时才能运行的聪明解决方案吗? :d 我认为问题是isProbablePrime,它不保证数字是素数。它只是说发现的素数可能是具有一定概率的素数。 你应该使用一种确定已找到素数的算法。
答案 2 :(得分:0)
第一个答案是不正确的,因为isProbablyPrime并不总是正确的(因此可能)。它的速度很慢,部分原因是因为你使用的是BigInteger。所涉及的所有价值都适合长期。为什么不长时间使用?
答案 3 :(得分:0)
可能会有一些简单的重构可以节省一些时间。似乎大部分时间都花在嵌套for循环中。数量级为n平方。您可以通过不嵌套循环来降低复杂性。另一个问题是您发现了比所需更多的潜在结果。您只需要找到200.您需要找到更多的原因是由于您没有在数字顺序中找到可能的结果。 TreeSet确实按顺序保存结果,但如果在找到第200个结果时能够停止,算法会更快。