素数代码

时间:2013-03-25 22:18:58

标签: c#

为什么这段代码不起作用?它应该把我所有的素数带到10,但我只得到数字2和3。

bool m = true;
int i;
int a;
for (a = 2; a <= 10; a++)
{
    for (i = 2; i < a; i++) 
    {
        if (a % i == 0)
        {
            m = false;
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }
}
Console.ReadKey();

4 个答案:

答案 0 :(得分:3)

两个主要问题。

  1. 你永远不会重置m所以一旦找到非素数,你就会在剩下的迭代中坚持这个结果。
  2. 当您正在测试非素数时,您只需继续进行,即可找到一个并覆盖您的结果。由于你的编写方式,它不是i-1 % i永远不会是== 0的大问题,但是如果你早点爆发,你可以节省很多时间。 (您也可以通过测试Math.Sqrt(a)来节省大量时间,因为在此之后,每个符合条件的除数都已经过测试(a / i = ba / b = i相同,因此您只需要检查其中一个))

答案 1 :(得分:1)

for (a = 2; a <= 10; a++)
{
    for (i = 2; i < a; i++)
    {
        if (a % i == 0)
        {
            m = false;
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }

    m = true; //<<******* Add this line
}

当然可以加快速度

for (a = 2; a <= 100; a++)
{
    for (i = 2; i < Math.Sqrt(a); i++) //<--- http://en.wikipedia.org/wiki/Prime_number#Trial_division
    {
        if (a % i == 0)
        {
            m = false;
            break; //<---- a is not prime, quit the inner loop immediately.
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }

    m = true; //<<******* Add this line
}

答案 2 :(得分:0)

在您通过非素数后,您不会重置m

答案 3 :(得分:-1)

你真的需要一个布尔变量吗?如果你需要做的只是打印值,那么你可以跳过布尔值:

int i;
int a;
for(a=2; a<=10; a++) {
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            Console.WriteLine(a);
            break;
        }
    }
}

请注意break强制退出内部for,因此您可以继续外部for的下一次迭代。


更正:上面的代码打印非素数数字。所以是的,您可能需要布尔变量来跟踪素数。但如果你想让它正常工作,你必须打破内心:

int i;
int a;
bool m;
for(a=2; a<=10; a++) {
    m = true
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            m = false;
            break;
        }
    }
    if (m) {
        Console.WriteLine(a);
    }
}

当然,你可以在没有布尔变量的情况下获得相同的结果,只需在休息后执行另一次比较:

int i;
int a;
for(a=2; a<=10; a++) {
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            break;
        }
    }
    if(a % i != 0) {
        Console.WriteLine(a);
    }
}