求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{}
}
}
}
这个程序是怎样执行的,我不理解,请高手指点

解决方案 »

  1.   

    第一个循环用来遍历2-50中的每个数j,
    第二个循环用来判断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)之间是否有因子即可。
      

  2.   

    利用的是一个定理——如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。只需将0和50之间得某个数n取出,并用循环将n除以从3到根号n之间的所有整数(2的不在考虑范围内,因为所有除2以外的偶数都是合数),如果期间存在一个数可以整除,那n为合数,否则为质数。
    程序好像就是实现的这个算法了
      

  3.   

    for(j=2;j <=50;j++){                        //当j=5时               
    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


      

  4.   

    for(j=2;j <=50;j++){                       //当j=5时              
    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 

      

  5.   

    呵呵。
    x=y*z,y是最小的质因数,则z>y
    y<=根号x不成立,则y>根号x,z>根号x
    x=y*z>根号x*根号x=x
    x>x不成立必有y<=根号x