[英]Find the number of divisors of a number given an array of prime factors using LINQ
[英]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.