1.例如求1000以内的素数:

方法一:定义

素数:除了1和它本身以外不再被其他的除数整数。

[java] view plain copy
 
  1.     public void printPrime(){  
  2.         for(int i=2; i<1000; i++)  
  3.         {  
  4.             if(2==i || 3==i){  
  5.                 System.out.print(i+" ");  
  6.                 continue;  
  7.             }  
  8.             int j=2;  
  9.             while(j<i){  
  10.                 if(i%j==0){  
  11.                     break;  
  12.                 }  
  13.                 j++;  
  14.             }  
  15.             if(j==i){  
  16.                 System.out.print(i+" ");  
  17.             }  
  18.         }  
  19.     }  

 

方法二:合数

1 合数定义:指自然数中除了能被1和本身整除外,还能被其他数(0除外)整数的数

2 大于1的自然数,不是质数就是合数。

3 如果N是个合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2,且 d1和d2中必有一个小于或等于√N

思路:大于1的整数中排除合数,剩下的就是素数。

[java] view plain copy
 
  1.  public void printPrime(){  
  2.         for(int i=2; i<1000; i++){  
  3.             boolean isPrime =true;  
  4.             for(int j=2; j<(int)Math.sqrt(i); j++){  
  5.                 if(i%j==0)  
  6.                     isPrime=false;  
  7.             }  
  8.             if(isPrime){  
  9.                 System.out.print(i+" ");  
  10.             }  
  11.         }  
  12.  }  

 

判断 101-200 之间有多少个素数,并输出所有素数

public class Prime {

    public static int count = 0;

    public static void main(String[] args) {

        for (int i = 101; i < 200; i++) {
            boolean b = true;
            for (int j = 2; j <=  Math.sqrt(i); j++) {//---------------

                if (i % j == 0) {
                    b = false;
                    break;
                }
            }
            if (b) {
                System.out.print(i+" ");
                count++;
            }
        }
        System.out.println("\n素数的个数:" + count);
    }
}

发现 第二for循环不用 Math.sqrt(i) 总是有问题

然后,发现了这个问题:为什么要用Math.sqrt(i)方法(返回正确舍入的 double 值的正平方根)?

 因为,只需要判断到这个值,
 例如:判断100,只需要判断到10就可以了,10*10
 100=n1*n2,那么n1或者n2一定有个<=10,所以只需要判断的10
提高效率

2.java交换两个变量的值

以下方法的根本原理就是: 

借助第三个变量

c = a;
a = b;
b = c;

运算符-不借助第三变量: 
a = a+b; 
b = a-b; 
a = a-b; 
为运算符-不借助第三个变量: 

(此种方法运用这种原理:一个数对另一个数位异或两次,该数不变)
a = a^b; 
b = a^b; 
a = a^b; 

复制代码
/**
 * Swap
 * 互换两个变量的值的方法
 * @author bc
 * @since 2018年3月27日
 */
public class Swap {
    public static void main(String[] args) {
        int a = 3, b = 5;
        System.out.println("===临时变量===");
        temp(a, b);
        System.out.println("===算数运算===");
        arithmetic(a, b);
        System.out.println("===位运算====");
        bit(a, b);
    }

    // 借助第三个变量,使a,b变量的值交换
    public static void temp(int a, int b) {
        System.out.println("a=" + a + ";b=" + b);

        int c = a;
        a = b;
        b = c;

        System.out.println("a=" + a + ";b=" + b);
    }

    // 算数运算--(不借助第三个变量)
    public static void arithmetic(int a, int b) {
        System.out.println("a=" + a + ";b=" + b);

        a = a + b;//8
        b = a - b;//3
        a = a - b;//5

        System.out.println("a=" + a + ";b=" + b);
    }

    // 位运算--(不借助第三个变量)
    public static void bit(int a, int b) {
        System.out.println("a=" + a + ";b=" + b);
        
        //按位异或的运算规则--异:1
        /**
         *     a    :0011
         *     b    :0101
         * a^b  :0110
         */
        a = a ^ b; //0110
        /**
         *     a     :0110
         *     b     :0101
         *     a^b  :0011
         */
        b = a ^ b; //0011
        /**
         *     a     :0110
         *     b     :0011
         *     a^b  :0101
         */
        a = a ^ b; //0101

        System.out.println("a=" + a + ";b=" + b);
    }
}
posted on 2018-04-23 13:51  章鱼家  阅读(193)  评论(0编辑  收藏  举报