为什么这段代码不起作用?它应该把我所有的素数带到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();
答案 0 :(得分:3)
两个主要问题。
m
所以一旦找到非素数,你就会在剩下的迭代中坚持这个结果。i-1 % i
永远不会是== 0
的大问题,但是如果你早点爆发,你可以节省很多时间。 (您也可以通过测试Math.Sqrt(a)
来节省大量时间,因为在此之后,每个符合条件的除数都已经过测试(a / i = b
与a / 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);
}
}