Java基础之如何求取质数

文章目录

  • 质数
    • 分析:
      • 质数有什么特点?
      • 方法1:
      • 方法2:
      • 方法3:
      • 方法4:
    • 案例
      • 案例代码
    • 问题:
      • 方法1
      • 方法2:
    • 总结

质数

分析:

质数有什么特点?

大于1,只能被1和本身整除的,再没有其他因数的数

方法1:

n<=3时,质数有2和3
当n>3时,质数无法被比它小的数整除

  • 通过for循环简单粗暴的判断(除去2)
for(int i = 3;i < 100;i++){
     for(int j = 2;j < i;j++ ){
         if(i % j == 0){
             break;
         }else if(j == i-1){
             System.out.println(i+"为质数");
         }
     }
 }
  • 通过方法返回boolean值判断
public static boolean isPrime1(int n) {
	// n<=3时,质数有2和3
	if (n <= 3) {
		return n > 1;
	}
	// 当n>3时,质数无法被比它小的数整除
	for (int i = 2; i < n; i++) {
		if (n % i == 0) {
			return false;
		}
	}
	return true;
}

方法2:

当一个数不是质数时,必定存在两个约数
一个大于等于sqrt(n),另一个必定小于sqrt(n)

public static boolean isPrime2(int n) {
	if (n <= 3) {
		return n > 1;
	}
	int sqrt = (int) Math.sqrt(n);
	for (int i = 2; i <= sqrt; i++) {
		if (n % i == 0) {
			return false;
		}
	}
	return true;
}

方法3:

一个数不能被2整除,那么这个数一定不能被其他偶数整除

public static boolean isPrime3(int n) {
	if (n <= 3) {
		return n > 1;
	}
	int sqrt = (int) Math.sqrt(n);
	for (int i = 3; i <= sqrt; i += 2) {
		if (n % 2 == 0 || n % i == 0) {
			return false;
		}
	}
	return true;
}

方法4:

(大于等于5的)质数一定和6的倍数相邻,一个是6x-1或6x+1

public static boolean isPrime4(int n) {
	if (n <= 3) {
		return n > 1;
	}
	if (n % 6 != 1 && n % 6 != 5) {
		return false;
	}
	int sqrt = (int) Math.sqrt(n);
	for (int i = 5; i <= sqrt; i += 6) {
		if (n % i == 0 || n % (i + 2) == 0) {
			return false;
		}
	}
	return true;
}

案例

输出1–100之间的质数

案例代码

public class Qualitative {
	public static void main(String[] args) {
		// 负责取出1~100之间的每个数
		for (int num = 2; num <= 100; num++) {
			boolean b = true;
			// 内层循环负责制造每个数的除数
			for (int n = 2; n < num; n++) {
				if (num % n == 0) {
					b = false;
					break;
				}
			}
			if (b) {
				System.out.println(num);
			}
		}
		}
	}

问题:

我要是想输出任意范围内的质数,该如何?(以下代码只需放在main方法中即可运行,注意引入Scanner包)

方法1

直接在main()中写好程序。

// 键盘录入数据
Scanner input = new Scanner(System.in);
System.out.println("请输入开始值:");
int start = input.nextInt();
System.out.println("请输入结束值:");
int end = input.nextInt();
input.close();

// for循环输出
for (int num = start; num <= end; num++) {
	boolean b = true;
	for (int n = 2; n < num; n++) {
		if (num % n == 0) {
			b = false;
			break;
		}
	}
	if (b) {
		System.out.println(num);
	}
}

方法2:

通过调用方法isPrime4(这里以isPrime4为例,当然可以调用其他方法)

// 键盘录入数据
Scanner input = new Scanner(System.in);
System.out.println("请输入开始值:");
int start = input.nextInt();
System.out.println("请输入结束值:");
int end = input.nextInt();
input.close();

int n = start;
while (n >= start  & n < end) {
	if (isPrime4(n)) {
		System.out.println(n);
	}
	n++;
}

总结

不知道细心的小伙伴有没有发现,为什么在方法中我采用的是
当n<=3时,质数有2和3
if (n <= 3) {
return n > 1;
}
而不直接返回true,这是因为当n<=3时,也可能是负数(即非法数字)是我们采用逻辑表达式,就完美避过这个坑。

你可能感兴趣的:(算法,java)