1.例如求1000以内的素数:
方法一:定义
素数:除了1和它本身以外不再被其他的除数整数。
- public void printPrime(){
- for(int i=2; i<1000; i++)
- {
- if(2==i || 3==i){
- System.out.print(i+" ");
- continue;
- }
- int j=2;
- while(j<i){
- if(i%j==0){
- break;
- }
- j++;
- }
- if(j==i){
- System.out.print(i+" ");
- }
- }
- }
方法二:合数
1 合数定义:指自然数中除了能被1和本身整除外,还能被其他数(0除外)整数的数
2 大于1的自然数,不是质数就是合数。
3 如果N是个合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2,且 d1和d2中必有一个小于或等于√N
思路:大于1的整数中排除合数,剩下的就是素数。
- public void printPrime(){
- for(int i=2; i<1000; i++){
- boolean isPrime =true;
- for(int j=2; j<(int)Math.sqrt(i); j++){
- if(i%j==0)
- isPrime=false;
- }
- if(isPrime){
- System.out.print(i+" ");
- }
- }
- }
判断 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); } }