Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标签为;“继续”;不';好像不行_Java_Primes_Labelled Break - Fatal编程技术网

Java 标签为;“继续”;不';好像不行

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> {

刚开始学习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());   
        }
    }
}
公共类素数{
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。您的第三点描述了所需的行为,而不是一个问题。