使Eratosthenes的筛子更有效率和更高效率打印布尔数组的值

时间:2014-11-11 00:22:11

标签: java arrays

对于课程作业,我被要求用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.如何打印此数组的所有真元素(素数)

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;直到标记为复合。

  1. 将数组中的所有数字标记为true,即&#34;到目前为止的数字&#34;。
  2. for循环中,如果该号码仍然是true,那么它就是素数。标记其所有倍数,从该数字的两倍开始,false为复合。你可以使用内循环。
  3. 如果该数字为false,那么它的复合数量及其倍数也已标记为复合数。
  4. 在遍历for100的平方根后停止10循环。这种优化是可能的,因为您不会再找到任何数字来标记复合。如果此处的数字是复合数字且数字的倍数大于10,则还有一个小于10的因子已将该数字标记为复合数。