C# 素数码
为什么这个代码不起作用?它应该把所有的素数都带到10,但是我只得到2和3C# 素数码,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.
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);
}
}