C# 素数码

C# 素数码,c#,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.

为什么这个代码不起作用?它应该把所有的素数都带到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();
在通过非素数后,不能重置m

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
}
两大问题

你永远不会重置m,所以一旦你找到了一个非素数,你就会在剩下的迭代中一直使用这个结果。 当你在测试一个非素数时,你只需继续进行一个,一旦你找到一个,你就会覆盖你的结果。由于你是怎么写的,这并不是什么大问题,因为i-1%i永远不会是==0,但是如果你提前爆发的话,你可以为自己节省很多时间。您还可以通过测试Math.Sqrta来节省大量时间,因为在这一点之后,每个合格的除数都将被测试a/i=b与a/b=i相同,所以您只需要检查其中一个
你真的需要一个布尔变量吗?如果只需打印值,则可以跳过布尔值:

int i;
int a;
for(a=2; a<=10; a++) {
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            Console.WriteLine(a);
            break;
        }
    }
}
当然,不使用布尔变量也可以得到相同的结果,只需在中断后执行另一个比较:

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);
    }
}

对SO社区友好一点并格式化你的问题怎么样?可能是因为在a==3之后的其余迭代中m是假的。。。。下次尝试调试器时,他们在这类问题上做得非常好。请为变量选择好的名称。一个字母很少足以描述意思。。。除了也许我。。。并避免在标题中添加感谢信和标签。您是否尝试过调试代码?设置一个断点,看看当a==5时会发生什么只要运行代码,看看原因。@I4V找到了。非常感谢。我已经更正了代码Barranka,为什么你在没有验证的情况下发布答案。你的第二个答案当然,如果布尔变量不起作用,你也可以得到同样的结果。我忽略了第一种方法中的语法错误。在获得更多投票的同时,收集其他答案的最佳部分以确保被接受。。。
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);
    }
}