对于课程作业,我被要求用Java编写代码来获取Eratosthenes的筛子,我的代码非常低效。它并不需要很长时间才能运行,但我确信还有另外一个循环的空间,除了列出我所做的一切......
这是我的代码:
public class test
{
public static boolean[] myArray()
{
boolean[] myArray = new boolean[100];
for(int i = 1;i <100; i++)
{
if(i % 2 ==0)
{
myArray[i] = true;
}
if(i % 3 ==0)
{
myArray[i]= true;
}
if(i % 5 ==0)
{
myArray[i]= true;
}
if(i % 7 ==0)
{
myArray[i]= true;
}
if(i % 11 ==0)
{
myArray[i]= true;
}
}
myArray[2]=false;
myArray[3]=false;
myArray[5]=false;
myArray[7]=false;
myArray[11]=false;
return myArray;
}
}
基本上我所做的是将所有非素数的元素设置为true ..
所以我的主要两个问题是 1.有什么方法可以实现循环来缩短代码 2.如何打印此数组的所有真元素(素数)
答案 0 :(得分:0)
我希望这会有所帮助。无论如何,筛子是一个很长的话题:
public class test
{
public static boolean[] myArray(int MAX)
{
boolean[] myArray = new boolean[MAX+1];
// myArray[i] == false iff i is prime
for(int i = 2; i*i <= MAX; i++) // optimization: i*i to not check repeated divisors
{
if (!myArray[i]) // if i is prime
for (int j=i+i; j <= MAX; j += i) // mark all its multiples as not prime
myArray[j] = true;
}
return myArray;
}
public static void print(int[] myArray) { // print the array once computed
for (int i=2; i< myArray.length; ++i)
if (!myArray[i])
System.out.println(i+" is prime");
}
}
P.S。:代码未经过测试。
答案 1 :(得分:0)
你在这里做的是将2,3,5,7和11的所有倍数标记为true
,然后将这些数字本身设置为false
,但是你还是完成所有这100次。
您需要为Sieve做些什么:
最初,所有数字都是#34;到目前为止#34;直到标记为复合。
true
,即&#34;到目前为止的数字&#34;。for
循环中,如果该号码仍然是true
,那么它就是素数。标记其所有倍数,从该数字的两倍开始,false
为复合。你可以使用内循环。false
,那么它的复合数量及其倍数也已标记为复合数。for
,100
的平方根后停止10
循环。这种优化是可能的,因为您不会再找到任何数字来标记复合。如果此处的数字是复合数字且数字的倍数大于10
,则还有一个小于10
的因子已将该数字标记为复合数。