「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
相关推荐
Super Rookie5 分钟前
Spring Boot 企业项目技术选型
java·spring boot·后端
写不出来就跑路10 分钟前
Spring Security架构与实战全解析
java·spring·架构
ZeroNews内网穿透1 小时前
服装零售企业跨区域运营难题破解方案
java·大数据·运维·服务器·数据库·tcp/ip·零售
sleepcattt1 小时前
Spring中Bean的实例化(xml)
xml·java·spring
lzzy_lx_20891 小时前
Spring Boot登录认证实现学习心得:从皮肤信息系统项目中学到的经验
java·spring boot·后端
Dcs1 小时前
立即卸载这些插件,别让它们偷你的资产!
java
小七mod2 小时前
【Spring】Java SPI机制及Spring Boot使用实例
java·spring boot·spring·spi·双亲委派
亿.62 小时前
【Java安全】RMI基础
java·安全·ctf·rmi
ruan1145142 小时前
Java Lambda 类型推断详解:filter() 方法与 Predicate<? super T>
java·开发语言·spring·stream
朱杰jjj2 小时前
解决jenkins的Exec command命令nohup java -jar不启动问题
java·jenkins·jar