「Java案例」求n1-n2内的素数

案例解析

判断单个数是否为素数

编写一个程序,从控制台读取一个整数,判断这个整数是否为素数。素数是指大于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
相关推荐
永卿0017 分钟前
设计模式-责任链模式
java·设计模式·责任链模式
hello 早上好11 分钟前
深入解析AOP调用链:递归与责任链模式的协同实现
java·责任链模式
wangmengxxw21 分钟前
Spring-常用注解
java·数据库·spring·注解
籍籍川草28 分钟前
JVM指针压缩的那些事
java·开发语言·jvm
艾莉丝努力练剑37 分钟前
【C/C++】类和对象(上):(一)类和结构体,命名规范——两大规范,新的作用域——类域
java·c语言·开发语言·c++·学习·算法
myNameGL1 小时前
下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目
java·ide·intellij-idea
Emotion亦楠1 小时前
Java 学习笔记:常用类、String 与日期时间处理
java·笔记·学习
郝学胜-神的一滴2 小时前
Spring Boot Actuator 保姆级教程
java·开发语言·spring boot·后端·程序人生
jiangxia_10243 小时前
面试系列:什么是JAVA并发编程中的JUC并发工具类
java·后端
草莓爱芒果3 小时前
Spring Boot中使用Bouncy Castle实现SM2国密算法(与前端JS加密交互)
java·spring boot·算法