For循环解释

时间:2015-06-30 03:45:31

标签: java

class Prime {

    public static void main(String args[]) {
        int i, j;
        boolean isprime;

        for (i = 2; i < 100; i++) {
            isprime = true;

            //See if the number is evenly disible 
            for (j = 2; j <= i / j; j++) // if it is , then it's not prime.
            {
                if ((i % j) == 0) {
                    isprime = false;
                }
            }

            if (isprime) {
                System.out.println(i + " is prime.");
            }
        }
    }
}

好的,有人可以向我解释一下这段代码。我有点理解它并通过命令提示符运行它。但我仍然对for循环感到困惑&#34; for ( j=2; j <= i/j; j = ++)&#34; ...为什么我们必须将i除以j?

运行代码的第一个序列: j增加了吗?我想不会导致条件j <= i/j---2<= 2/2不正确。如果我错了,请纠正我......当整个程序结束时或j之前我是否会增加?

1 个答案:

答案 0 :(得分:0)

您不必......但如果您这样做,则可以使代码运行得更快。

假设你是这样写的:

for ( i=2 ; i<100 ; ++i )
{
    isprime = true ;
    for ( j=2 ; j<100 ; ++j )
    {
        if ( (i%j) == 0 )
        {
            isprime = false ;
            break ;
        }
    }

    if ( isprime )
    {
        System.out.println ( i + " is prime." ) ;
    }
}

这段代码绝对有用。它基本上是在说

对于每个号码,我,在[2,100]范围内...... 对于每个数字,j,在[2,100]范围内...... 如果我可以被j整除而没有余数,那么我就不是素数。

但是,你知道我永远不会被大于它的东西整除,所以你可以优化循环来读取:

for ( i=2 ; i<100 ; ++i )
{
    isprime = true ;
    for ( j=2 ; j<i ; ++j )
    {
        if ( (i%j) == 0 )
        {
            isprime = false ;
            break ;
        }
    }

    if ( isprime )
    {
        System.out.println ( i + " is prime." ) ;
    }
}

哪个做同样的事情,但只运行j到(但不包括)i。但你可以加快速度,因为如果一个数字可以被一个大于其平方根的数字整除,那么它也可以整除一小于它的平方根的第二个数字。

所以你可以自己计算平方根......或者你可以这样做:

for ( i=2 ; i<100 ; ++i )
{
    isprime = true ;
    for ( j=2 ; j<=i/j ; ++j )
    {
        if ( (i%j) == 0 )
        {
            isprime = false ;
            break ;
        }
    }

    if ( isprime )
    {
        System.out.println ( i + " is prime." ) ;
    }
}

所以,让我们说i = 5。内循环将:

j=1, so i/j=5, so we test this
j=2, so i/j=2, so we test this
j=3, so i/j=1, so we don't test this - because obviously the number I have chosen is greater than the square root

此时,您知道您选择的数字大于平方根,因此您可以停止搜索。

这样做的好处是你也不必调用sqrt()函数,这很慢。