public class Prime
{
public static void main(String [] args)
{
int num = 3;
int counter = 1;
boolean flag = true;
while(counter < 10001)
{
for(int i = 2; i < num; i++)
{
if(num%i==0)
{
flag = false;
}
}
if(flag)
{
counter++;
}
num++;
}
System.out.println(num);
}
}
每当我运行此代码时,都不会打印出任何结果。我假设它是因为代码效率低下,但我不知道这段代码有什么问题。
答案 0 :(得分:3)
您的问题是,在flag
循环之前,您不能将for
重置为true;因此,一旦它为false
,它仍为false
,因此counter
永远不会增加,这意味着while
循环保护永远不会变为false
。
这是为什么你应该在最严格的范围内(即在while循环内)声明变量的一个例子。
while(counter < 10001)
{
int flag = true;
for (...) {...}
if (flag) { counter++; }
// ...
}
在您考虑是否效率之前,还应该确保您的代码正确的一个示例。如果您调试了代码(或者甚至只是添加了几个System.out.println
),您可能会发现它实际上并没有做正确的事情。
答案 1 :(得分:1)
正如@AndyTurner所提到的,你应该在flag = true;
循环中声明while
,并且你的逻辑中找到素数时会有轻微错误。
在检查num
后,您正在递增prime
。因此,如果您的第3个素数为5
,那么它将打印6
作为答案。如果你的第10001个素数是X
,那么它将打印X + 1
作为答案。
我已在下面为您的问题发布了正确的逻辑。我希望它可以帮助你。
public class Main
{
public static void main(String [] args)
{
int num = 2;
int counter = 1;
boolean flag = true;
while(counter < 10001)
{
flag = true;
num++;
for(int i = 2; i < num; i++)
{
if(num%i==0)
{
flag = false;
}
}
if(flag)
{
counter++;
}
}
System.out.println(num);
}
}
答案 2 :(得分:0)
它不打印导致它进入无限循环,因为一旦标志变为假,计数器不会递增
public static void main(String [] args)
{
int num = 3;
int counter = 1;
boolean flag = true;
while(counter < 10001)
{
flag = true;
for(int i = 2; i < num; i++)
{
if(num%i==0)
{
flag = false;
}
}
if(flag)
{
counter++;
}
num++;
}
System.out.println(num);
}
试试这个。希望它有所帮助