簡體   English   中英

查找下一個素數

[英]Find next Prime Number

我正在嘗試在用戶輸入號碼后找到下一個素數。

這是我到目前為止的代碼:

public int Calculation(int number)
{
    //set the isPrime to false
    bool isPrime = false;

    //do this while isPrime is still false
    do
    {
        //increment the number by 1 each time
        number = number + 1;

        int squaredNumber = (int)Math.Sqrt(number);

        //start at 2 and increment by 1 until it gets to the squared number
        for (int i = 2; i <= squaredNumber; i++)
        {
            //how do I check all i's?
            if (number % i != 0)
            {
                isPrime = true;
            }


        }


    } while (isPrime == false);

    //return the prime number
    return number;
}

我知道丟失了一些東西,因為我第一次給出的余數不是0,那么它將返回該數作為質數。 問題是我無法弄清楚邏輯/語法來查看該循環中的每個i是否都不為0。

有更好的方法來查找素數,但為了與算法保持一致,要執行的操作是從isPrime = true;開始isPrime = true; ,然后將其設置為false ,如果有任何i在余數是0。你也可以break在這一點圈外。

所以是一個修訂版:

public int Calculation(int number)
{    
    while(true)
    {
        bool isPrime = true;
        //increment the number by 1 each time
        number = number + 1;

        int squaredNumber = (int)Math.Sqrt(number);

        //start at 2 and increment by 1 until it gets to the squared number
        for (int i = 2; i <= squaredNumber; i++)
        {
            //how do I check all i's?
            if (number % i == 0)
            {
                isPrime = false;
                break;
            }
        }
        if(isPrime)
            return number;
    }
}

如果將BitArray用作Eratosthenes的篩網,則不需要循環即可測試素數。 根據它的質數,在該索引處的BitArray的值為true或false。

這樣的函數將產生Bitarray:

public static BitArray ESieve(int upperLimit)
{
    int sieveBound = (int)(upperLimit - 1);
    int upperSqrt = (int)Math.Sqrt(sieveBound);
    BitArray PrimeBits = new BitArray(sieveBound + 1, true);
    PrimeBits[0] = false;
    PrimeBits[1] = false;
    for(int j = 4; j <= sieveBound; j += 2)
    {
        PrimeBits[j] = false;
    }
    for(int i = 3; i <= upperSqrt; i += 2)
    {
        if(PrimeBits[i])
        {
            int inc = i * 2;
            for(int j = i * i; j <= sieveBound; j += inc)
            {
                PrimeBits[j] = false;                       
            }
        }
    }
    return PrimeBits;
}

聲明Bitarray:

BitArray IsPrime = ESieve(1000000);

找到下一個素數很簡單,只需遍歷位數組以找到下一個設置為true的問題:

int FindNextPrime(int number)
{
    number++;
    for(; number < IsPrime.Length; number++)
        //found a prime return that number
        if(IsPrime[number])
            return number;
    //no prime return error code
    return -1;
}
if ((number % i) != 0)
{
    isPrime = true;
}

由於%的運算符優先級比!=低,因此您需要將數字%i包裹在括號中。 我沒有測試其余邏輯的正確性,但是輸入5會正確返回7作為下一個質數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM