麻烦程序中的循环以查找素数

时间:2015-06-07 09:56:37

标签: c# loops console-application nested-loops

嗨,我一直在努力解决如何使其发挥作用。它' S 旨在使用用户输入来设置x的第一个x个素数。然后在打印结果之前将其放入数组中。我想我已经对循环产生了问题,因为一旦输入用户输入,就不会发生任何事情。如果有人能指出我出错的地方并就如何解决问题提出建议,我将不胜感激。感谢

ArrayList

2 个答案:

答案 0 :(得分:1)

首先,这不是测试一个数字是否为素数的方法,但是再一次,这个周期都是错误的。

如果你设置的最大值高于素数小于9999的最大值,它将永远在外循环中循环。

查看维基以获取一些初步见解:http://en.wikipedia.org/wiki/Primality_test

要检查我的语句,您可以在外部循环中添加一些控制台输出,并亲自查看

答案 1 :(得分:0)

本着尝试保留原始代码的精神,这里是对您的算法的调整后的修改,修改为使用Sieve of Eratosthenes

  • Sieve可以迭代地确定所有素数,只知道2是素数。
  • 内环上的退出条件应该是当我们超出我们正在测试的数字的平方根时,我们的已知素数列表(不是9999break)。由于素数的定义,素数列表最多为X,我们可以解析所有其他素数直到X * X.(因此,如果我们超过平方根,我们可以停止测试,例如2可以解析3和4,2和3可以解决多达9等)。这也是因为我们的素数已按升序排序。
  • 我保留了原始变量,即count是下一个测试候选素数,i是素数的当前索引,max是填充的上限。
  • 第一个素数2需要进行硬编码(即primes[0] = 2,下一个主要指数i将为1,我们之后需要检查的第一个候选数字将为3。 / LI>

// We do need to hard code that 2 is a prime number. Everything else can be derived
primes[0] = 2;
i = 1;
count = 3;

// i.e. stop when we get the required number of primes
while (i < max)
{
    // Indicator to stop testing this candidate if we find a factor
    bool foundFactor = false;
    // Start off each primality test from the start of our primes array
    var primeIndex = 0;

    // Try and find a factor of 'count' with our known primes
    while (!foundFactor && primeIndex < i)
    {
        // We can stop after the square root. Multiplication is faster than sqrt
        if (primes[primeIndex]*primes[primeIndex] > count)
            break;
        // If the candidate number
        if (count % primes[primeIndex] == 0)
            foundFactor = true;
        primeIndex++;
    }
    if (!foundFactor)
    {
        primes[i] = count;
        i++;
    }

    count++;
}

根据@ Massimo的链接,上述暴力机制非常低效。一个改进是6&#39;的轮子。在Wiki文章中引用 - 在count=6之后,6的轮子将每个候选数字集合分批测试,并且可以立即消除所有2和3的倍数。其他更大的轮子也是可能的。