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("
素数的个数:" + 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);
}
}
