【问题标题】:Find next Prime Number查找下一个质数
【发布时间】:2014-07-01 21:47:31
【问题描述】:

我试图在用户输入的数字之后找到下一个质数。

这是我目前的代码:

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 作为余数。

【问题讨论】:

  • 我认为你检查素数是错误的,如果number % i == 0 那么i 是一个除数所以这个数字不是素数。
  • 什么是“下一个素数”?你的意思是,最小的质数大于用户输入的数字?
  • 是的。因此,如果他们输入 5,则返回 7。例如,如果他们输入 7,则返回 11。

标签: c# primes


【解决方案1】:

有更好的方法可以找到素数,但要与您的算法保持一致,您要做的是从 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;
    }
}

【讨论】:

  • 他的变量命名错误
  • 我认为他是他的平方根吧?他称它为squaredNumber,但它是Sqrt 操作。
  • 我删除了我的答案,因为它们是相同的,而您是第一个,但作为旁注,仅转换为 int 不会完美舍入,请参阅 stackoverflow.com/questions/4181942/convert-double-to-int,我会使用不同的方法用于四舍五入的算法。您还想从@elgonzo 指出的number 而不是2 开始
  • 谢谢!你的对我来说最有意义。我为这个愚蠢的问题道歉(因此我猜是反对票)。只编程了一个月,就被难住了。我想它的关键是记住 break 仅来自“if”语句,而不是整个 for 循环。这样它就可以继续循环
  • @OutlawLemur 是的,这些都是好点。除了导致实际问题的原因之外,我并没有改进算法,因为生成素数很难知道何时停止改进!但这些都是 OP 需要牢记的要点
【解决方案2】:

如果您将 Bi​​tArray 用作 Eratosthenes 筛,则不需要循环来测试素数。该索引处的 BitArray 的值将根据它是否为素数而为真或假。

这样的函数会产生 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 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;
}

【讨论】:

  • 这太棒了
【解决方案3】:
if ((number % i) != 0)
{
    isPrime = true;
}

您需要将数字 % i 包含在括号中,因为 % 的运算符优先级低于 !=。我没有测试你其余逻辑的正确性,但输入 5 正确返回 7 作为下一个素数。

【讨论】:

  • Erm no...10 % 2 != 0 是假的,(10 % 2) != 0 也是假的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2022-12-12
相关资源
最近更新 更多