嗨,我一直在努力解决如何使其发挥作用。它' S 旨在使用用户输入来设置x的第一个x个素数。然后在打印结果之前将其放入数组中。我想我已经对循环产生了问题,因为一旦输入用户输入,就不会发生任何事情。如果有人能指出我出错的地方并就如何解决问题提出建议,我将不胜感激。感谢
ArrayList
答案 0 :(得分:1)
首先,这不是测试一个数字是否为素数的方法,但是再一次,这个周期都是错误的。
如果你设置的最大值高于素数小于9999的最大值,它将永远在外循环中循环。
查看维基以获取一些初步见解:http://en.wikipedia.org/wiki/Primality_test
要检查我的语句,您可以在外部循环中添加一些控制台输出,并亲自查看
答案 1 :(得分:0)
本着尝试保留原始代码的精神,这里是对您的算法的调整后的修改,修改为使用Sieve of Eratosthenes:
9999
和break
)。由于素数的定义,素数列表最多为X,我们可以解析所有其他素数直到X * X.(因此,如果我们超过平方根,我们可以停止测试,例如2可以解析3和4,2和3可以解决多达9等)。这也是因为我们的素数已按升序排序。count
是下一个测试候选素数,i
是素数的当前索引,max
是填充的上限。 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的倍数。其他更大的轮子也是可能的。