刚开始学习java,我无法理解我的代码有什么问题。 PrimeIterator 应该生成无限数量的素数(从数字3开始),但是当我打印输出时,我得到:3,5,7,9,11,13,15等。
public class Prime {
PrimeIterator iter = new PrimeIterator();
private class PrimeIterator implements java.util.Iterator<Integer>
{
int numb = 1;
public boolean hasNext()
{
return true;
}
public Integer next()
{
nextCandidate:
do{
numb += 2;
int numbSqrt = (int)java.lang.Math.sqrt(numb);
for (int i = 3; i <= numbSqrt; i = i+2)
{
if (numb % i == 0)
{
continue nextCandidate;
}
}
}while(false);
return numb;
}
public void remove() {}
}
void printPrimes()
{
System.out.print(2);
while(iter.hasNext())
{
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print(", " + iter.next());
}
}
}
我想在我的do-while循环中使用标记为“continue”的语句。然而,我的直觉告诉我,我错误地使用它。
答案 0 :(得分:1)
麻烦在于while(false)
延续条件。作为do while(false)
语句,这意味着它永远不会循环多次。也就是说,当您尝试将执行跳转到带标签的语句时,它将不再循环通过do while
,因为即使您认为{{false
,也不会验证延续条件(continue
) 1}}将再次执行循环。
因此,每次numb
方法执行时,它永远不会增加next()
次。
我会做以下事情:
nextCandidate:
do{
numb += 2;
int numbSqrt = (int)java.lang.Math.sqrt(numb);
for (int i = 3; i <= numbSqrt; i = i+2)
{
if (numb % i == 0)
{
continue nextCandidate;
}
}
break;
}while(true);
答案 1 :(得分:1)
以下是我看到的问题
你甚至不打印输出。
(int)java.lang.Math.sqrt(5)
最终会截断为2
。你应该在你的平方根上加1,因为如果你没有足够的迭代就会出现问题,但是如果迭代次数超过你需要的话就没问题。
当您找到素数时,for
循环将结束,while(false)
将终止执行循环