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之前我是否会增加?
答案 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()函数,这很慢。