求50以内的质数
public class Example2_12{
public static void main(String[] args){
int i,j;
for(j=2;j<=50;j++){
for(i=2;i<=j/2;i++)
if(j%i==0) break;
if(i>j/2){
System.out.println("\t"+j+"是质数");
} else{}
}
}
}
这个程序是怎样执行的,我不理解,请高手指点
public class Example2_12{
public static void main(String[] args){
int i,j;
for(j=2;j<=50;j++){
for(i=2;i<=j/2;i++)
if(j%i==0) break;
if(i>j/2){
System.out.println("\t"+j+"是质数");
} else{}
}
}
}
这个程序是怎样执行的,我不理解,请高手指点
第二个循环用来判断j是否为素数,其中i<=j/2还是多判断了几个数,最好改成i<=Math.sqrt(j)效率比较高。
当一个数j%i==0说明i是j的因子,此时i<=Math.sqrt(j)所以会执行System.out.println("\t"+j+"是质数");
而如果i<Math.sqrt(j)都没有因子,那么在Math.sqrt(j)与j之间也不会有因子。
因为如果Math.sqrt(j)与j之间有因子,即mn=j,Math.sqrt(j)<m<j,那么n必然小于Math.sqrt(j)。否则mn>=Math.sqrt(j)*Math.sqrt(j)=j。
所以只要判断2~Math.sqrt(j)之间是否有因子即可。
程序好像就是实现的这个算法了
for(i=2;i <=j/2;i++) i=3
if(j%i==0) break; //j%i != 0 j%i != 0
if(i>j/2){ //2>2 false true
System.out.println("\t"+j+"是质数"); 3是质数 进入i=4
} else{} //进入i=3
}
}
for(i=2;i <=j/2;i++) i=3
if(j%i==0) break; //j%i != 0 j%i != 0
if(i>j/2){ //2>2 false true
System.out.println("\t"+j+"是质数"); 3是质数 进入i=4
} else{} //进入i=3
}
}
x=y*z,y是最小的质因数,则z>y
y<=根号x不成立,则y>根号x,z>根号x
x=y*z>根号x*根号x=x
x>x不成立必有y<=根号x