【发布时间】:2014-05-11 19:35:17
【问题描述】:
素数真的很奇怪......我出于无聊创造了这个简单的模式。我在网上没有看到任何相似之处。如您所见,根据您选择的比例,图片有缺失线,范围从 1 到 1000000
我打算从 1 - 25,000,000 甚至 1 - 10,000,000,000 的值开始
也许使用筛分技术会有所帮助,但我需要一个足够的 java 实现,我使用由 2 个 for 循环组成的经典素数检查器,它确实会占用时间。
编辑:这是我的代码示例
boolean checkPrime(long a)
{
long count = 0L;
for(long op = 1;op<=a;op++)
if(a%op==0)
count++;
return count ==2;
}
更新:我为我的代码找到了一个简单的优化措施
boolean checkPrime(long a)
{
long count = 0L;
for(long op = 1;op<=a;op++)
if(a%op==0)
{
count++;
if(count>2)break; //here it is
}
return count ==2;
}
代码运行速度似乎快了 10 倍
我最终选择创建并坚持下去。
package superprime;
public class SuperPrime {
static java.util.List primes = new java.util.ArrayList<Long>();
public static void main(String[] args) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
long start = System.currentTimeMillis();
primes.add(2);
boolean flag = true;
long u =primes.size();long wow;double val;
for(long e = 3L; e<10000000;e=e+2){
flag = true;
for( wow = 0;(wow< u)&&flag;wow++){
if(e%(Long.parseLong(primes.get((int)wow)+""))==0)
flag=false;
}
if(flag)primes.add(e);
val = Double.parseDouble(primes.get((int)u)+"");
if((val == Math.sqrt(e+1))||(val == Math.sqrt(e+2)))u++;
// if(e%250000==0)System.out.println((System.currentTimeMillis()-start)/1000.0+" @ "+e);
}long end =System.currentTimeMillis();
System.out.println(""+(end-start)/1000.0);
wow = 1;
for(Object h : primes)System.out.println(++wow+"\t"+(Long.parseLong((h)+"")));
}
}
【问题讨论】:
-
查看维基百科以获得更好的算法
-
我不确定我在这里看到一个问题...
-
我试图根据我对维基百科页面的解释来编译结果,但我失败了。我只是一名高中生。
-
使用埃拉托色尼筛。由于此应用程序的明确下限是 O(N),因此它几乎是最优的(除了
log log N因素) -
@RichardKennethNiescior 你提到你没有实现维基百科的一些算法。你为什么不选择其中一个并专门问一个关于你在那里的困难的问题。此外,请遵循 Niklas 的建议并使用 Erasthotenes 筛。在某个地方查一下。该算法相当容易理解。 Niklas 的评论是关于算法计算复杂度的数学分析(与执行时间有关)。另外,请尝试更清楚地了解您将来的实际要求=)。
标签: java algorithm optimization solution