筛子定理数组中没有数字

时间:2015-01-29 17:42:56

标签: java arrays algorithm sieve-of-eratosthenes

我的justPrimes数组似乎没有工作,我无法弄清楚为什么,当我在控制台上打印出来看看里面有什么我只是一遍又一遍地重复了一堆随机字符..有谁能发现这个问题?

    int[] numberArray = new int[N];

    int primes = 0;
    for(int i = 2; i < numberArray.length; i++)
    {
        if(numberArray[i] == 0)
        {
            primes++;
            int multiple = 2*i;
            while(multiple < N)
            {
                numberArray[multiple] = 1;
                multiple = multiple + i;
            }
        }
    }


    int[] justPrimes = new int[primes];
    for(int c = 2; c < numberArray.length; c++)
    {
        for(int index = 0; index < primes; index++)
        {
            if(numberArray[c] == 0)
            {
                justPrimes[index] = c;
            }
        }


    }

2 个答案:

答案 0 :(得分:0)

当您尝试填写justPrimes时,您的第二部分是错误的:

    for(int index = 0; index < primes; index++)
    {
        if(numberArray[c] == 0)
        {
            justPrimes[index] = c;
        }
    }

这将只使用一个值justPrimes填充整个数组c,因此justPrimes将仅包含最后一个素数&lt; = N。

填写break后,您需要justPrimes,而第二个if条件还不够。

修复:

    for(int c = 2; c < numberArray.length; c++)
    {
        for(int index = 0; index < primes; index++)
        {
               if(numberArray[c] == 0 && justPrimes[index] == 0)//Need to find the correct index, which has not been filled in yet.
               {
                  justPrimes[index] = c;
                  break; //You forgot this
               }
        }
    }

更好的解决方案:

    for(int c = 2; c < numberArray.length; c++)
    {
        if(numberArray[c] == 0)
        {
            for(int index = 0; index < primes; index++)
            {
               if(justPrimes[index] == 0)
               {
                  justPrimes[index] = c;
                  break; //You forgot this
               }
            }
        }

    }

更好:

    int index = 0;
    for(int c = 2; c < numberArray.length; c++)
    {
        if(numberArray[c] == 0)
        {
            justPrimes[index++] = c;
        }
    }

答案 1 :(得分:0)

这个额外的循环打破了你的逻辑(尝试将每个素数写入多个插槽):

        for(int index = 0; index < primes; index++)

好像你真的想要:

    int index = 0; // instead of looping on index, initialize it to zero here
    for (int c = 2; c < numberArray.length; c++) {
        if (numberArray[c] == 0) {
            justPrimes[index] = c;
            index++; // then increment index here so next prime goes in next slot
        }
    }