案例解析
判断单个数是否为素数
编写一个程序,从控制台读取一个整数,判断这个整数是否为素数。素数是指大于1的自然数,且只能被1和它本身整除,没有其他正因数。
java
# 源文件保存为"PrimeNumberChecker.java"
import java.util.Scanner;
public class PrimeNumberChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int number = scanner.nextInt();
boolean flag = true;
for (int n = 2; n <= Math.sqrt(number); n++) {
if (number % n == 0) { //若number能被n整除,意味number数不是素数
//当前数不是素数,则flag的值更改为false
flag = false;
break; //跳出当前循环
}
}
if (flag) {
System.out.printf("%d是素数", number);
} else {
System.out.printf("%d不是素数", number);
}
scanner.close();
}
}
运行结果 输入数字5
请输入一个整数:5
5是素数
输入数字10
请输入一个整数:10
10不是素数
代码解析:
- 输入处理:使用Scanner获取用户输入的数字
- 优化检查范围:只需检查2到√number的范围,减少不必要的计算
- 模运算判断:如果number能被任何n整除,则不是素数
- 结果输出:根据判断结果输出相应信息
找出n1到n2之间的所有素数
判断一个整数m是不是素数,只需判断在[2,m-1]之间是否存在能将m整除的整数,如果都不能被整除,那么 m 就是一个素数。进一步思考,判别m是否是素数,只需判别m能否被[2, m/2]区间的整数整除即可。
java
# 源文件保存为"PrimeNumberRange.java"
import java.util.Scanner;
public class PrimeNumberRange {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入区间上界:");
int n1 = scanner.nextInt();
System.out.print("请输入区间下界:");
int n2 = scanner.nextInt();
int count = 0;
for (int m = n1; m < n2; m++) {
//设置逻辑值flag,初始化为true
boolean flag = true;
for (int n = 2; n <= Math.sqrt(m); n++) {
if (m % n == 0) { //若m能被n整除,意味当前数不是素数
//当前数不是素数,则flag的值更改为false
flag = false;
break; //跳出当前循环
}
}
//根据flag的结果,判断m是否是素数
if (flag) {
count++;
System.out.print(m + " ");
if (count % 10 == 0)
System.out.println();
}
}
scanner.close();
}
}
运行结果 输入上界和下界
请输入区间上界:2
请输入区间下界:10
2 3 5 7
代码特点:
- 允许用户指定查找范围
- 使用循环遍历范围内的所有数字
- 输出格式清晰易读
使用埃拉托斯特尼筛法找素数
埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种古老的算法,用于高效地找出一定范围内所有素数。它由古希腊数学家埃拉托斯特尼提出,核心思想是通过逐步排除合数(非素数),最终保留素数。
java
# 源文件保存为"SieveOfEratosthenes.java"
import java.util.Scanner;
public class SieveOfEratosthenes {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入上限数字n:");
int n = scanner.nextInt();
boolean[] isPrime = new boolean[n + 1];
for (int i = 2; i <= n; i++) {
isPrime[i] = true;
}
// 筛法核心逻辑
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
System.out.println("2到" + n + "之间的素数有:");
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
System.out.print(i + " ");
}
}
scanner.close();
}
}
运行结果 输入数字10
请输入上限数字n:10
2到10之间的素数有:
2 3 5 7
代码特点:
- 使用著名的埃拉托斯特尼筛法
- 算法效率更高,适合大范围查找
- 使用布尔数组标记素数
- 数学优化:从i²开始标记非素数
操作练习题
输出指定范围内的孪生素数
要求:
- 孪生素数是指相差2的素数对,如(3,5)、(5,7)
- 修改程序输出指定范围内的所有孪生素数对
参考代码:
java
# 源文件保存为"PrimeNumberChecker.java"
import java.util.Scanner;
public class PrimeNumberChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入开始数字:");
int start = scanner.nextInt();
System.out.print("请输入结束数字:");
int end = scanner.nextInt();
printTwinPrimes(start, end);
scanner.close();
}
// 判断素数的函数
public static boolean isPrime(int m) {
if (m <= 1) {
return false;
}
// 只需检查到平方根即可
for (int i = 2; i <= Math.sqrt(m); i++) {
if (m % i == 0) {
return false;
}
}
return true;
}
public static void printTwinPrimes(int start, int end) {
int prevPrime = 2; // 第一个素数
System.out.println(start + "到" + end + "之间的孪生素数对有:");
for (int i = start; i <= end; i++) {
if (isPrime(i)) {
if (i - prevPrime == 2) {
System.out.println("(" + prevPrime + ", " + i + ")");
}
prevPrime = i;
}
}
}
}
运行结果 输入开始数字和结束数字
scss
请输入开始数字:3
请输入结束数字:10
3到10之间的孪生素数对有:
(3, 5)
(5, 7)
计算指定范围内素数的和
要求:
- 编写方法计算并返回n1到n2之间所有素数的和
- 在main方法中调用并输出结果
参考代码:
java
# 源文件保存为"PrimeNumberChecker.java"
import java.util.Scanner;
public class PrimeNumberChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入开始数字:");
int start = scanner.nextInt();
System.out.print("请输入结束数字:");
int end = scanner.nextInt();
int sum = sumOfPrimes(start, end);
System.out.printf("%d到%d之间所有素数的和%d\n", start, end, sum);
scanner.close();
}
// 判断素数的函数
public static boolean isPrime(int m) {
if (m <= 1) {
return false;
}
// 只需检查到平方根即可
for (int i = 2; i <= Math.sqrt(m); i++) {
if (m % i == 0) {
return false;
}
}
return true;
}
public static int sumOfPrimes(int n1, int n2) {
int sum = 0;
for (int i = n1; i <= n2; i++) {
if (isPrime(i)) {
sum += i;
}
}
return sum;
}
}
运行结果 输入开始数字和结束数字
请输入开始数字:2
请输入结束数字:10
2到10之间所有素数的和17
输出指定范围内的回文素数
要求:
- 回文素数是指既是素数又是回文数的数字,如131
- 编写方法判断数字是否是回文数
- 输出指定范围内的所有回文素数
参考代码:
java
# 源文件保存为"PrimeNumberChecker.java"
import java.util.Scanner;
public class PrimeNumberChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入开始数字:");
int start = scanner.nextInt();
System.out.print("请输入结束数字:");
int end = scanner.nextInt();
printPalindromePrimes(start, end);
scanner.close();
}
// 判断素数的函数
public static boolean isPrime(int m) {
if (m <= 1) {
return false;
}
// 只需检查到平方根即可
for (int i = 2; i <= Math.sqrt(m); i++) {
if (m % i == 0) {
return false;
}
}
return true;
}
public static boolean isPalindrome(int number) {
String numStr = Integer.toString(number);
return numStr.equals(new StringBuilder(numStr).reverse().toString());
}
public static void printPalindromePrimes(int start, int end) {
System.out.println(start + "到" + end + "之间的回文素数有:");
for (int i = start; i <= end; i++) {
if (isPrime(i) && isPalindrome(i)) {
System.out.print(i + " ");
}
}
}
}
运行结果 输入开始数字和结束数字
请输入开始数字:100
请输入结束数字:999
100到999之间的回文素数有:
101 131 151 181 191 313 353 373 383 727 757 787 797 919 929