我试图在用户输入的号码后找到下一个素数。
这是我到目前为止的代码:
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作为余数。
答案 0 :(得分:4)
有更好的方法可以找到素数,但与您的算法保持一致,您想要做的是从isPrime = true;
开始,然后如果有{{1}则将其设置为false
其余为0的情况。此时您还可以i
退出循环。
所以修改后的版本:
break
答案 1 :(得分:3)
如果你使用BitArray作为Eratosthenes的Sieve,你不会需要一个循环来测试素数。根据它是否为素数,该索引处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);
查找下一个素数是一个简单的问题,即迭代通过比特阵列找到下一个设置为真:
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;
}
答案 2 :(得分:-3)
if ((number % i) != 0)
{
isPrime = true;
}
由于%运算符优先级低于!=,因此需要将数字%i包装在parens中。我没有测试其余逻辑的正确性,但输入5正确返回7作为下一个素数。