Java 标签为;“继续”;不';好像不行
刚开始学习java,我不明白我的代码出了什么问题。PrimeIterator应该生成无限数量的素数(从数字3开始),但当我打印输出时,我得到:3、5、7、9、11、13、15等等Java 标签为;“继续”;不';好像不行,java,primes,labelled-break,Java,Primes,Labelled Break,刚开始学习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> {
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());
}
}
}
公共类素数{
PrimeIterator iter=新的PrimeIterator();
私有类PrimeIterator实现java.util.Iterator
{
int numb=1;
公共布尔hasNext()
{
返回true;
}
公共整数next()
{
下一个条件:
做{
麻木+=2;
int numbSqrt=(int)java.lang.Math.sqrt(numb);
对于(int i=3;i问题在于while(false)
连续条件。作为do while(false)
语句,这意味着它不能循环超过一次。也就是说,当您尝试将执行跳转到带标签的语句时,它不会再次循环执行do while
,因为继续条件(false
)即使您认为continue
将再次执行循环,也不会验证
因此,每次执行next()
方法时,它不会增加numb
超过一次
我会做如下的事情:
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);
nextCandidate:
做{
麻木+=2;
int numbSqrt=(int)java.lang.Math.sqrt(numb);
对于(inti=3;i,这里是我看到的问题
你甚至没有打印输出
(int)java.lang.Math.sqrt(5)
将最终截断为2
。您应该在平方根中添加1,因为如果迭代次数不够,这是一个问题,但如果迭代次数超过需要,这不是问题
当您找到一个素数时,您的for
循环将结束,while(false)
将终止do-while循环
你知道9和15不是素数,对吧?也许我没有找到,但看起来你不是在打印输出,而不是继续。我建议中断。或者返回FALSE。请大家注意,他用nextCandidate
标签标记了他的do
循环。继续将影响外部循环。你的代码不会编译,因为它缺少Iterator
指定的void remove()
。拥有main
函数也会很好,这样我们就不必为了帮助您而创建它。谢谢,这就解释了我的问题!好的。请注意@Sam我发布的关于sqrt
截断的观察结果(第3点,在他的回答中)@AndreiNicusan你是对的。我担心如果I
是4,那么它会说4是素数,但是再一次,I
将永远不会是4
我想将我的数字增加2以优化整件事。我无法在我的素数迭代器子类中很好地实现生成数字2。实际上,不是我所想的更重要的是,平方根问题实际上不会成为一个问题either@Sam,我认为您可能已经产生了一个完整的错误三联图。他通过迭代器生成输出,该迭代器可以打印或由调用方使用(这是一种比直接打印更灵活的方法)。sqrt截断是一个功能,而不是一个bug。您的第三点描述了所需的行为,而不是一个问题。