Java---判断素数的三种方法

 我们首先先来了解一下什么是素数 

素数:一个整数只能被1和自身整除 , 注意:0与1不是素数

目录

方法一:暴力法

 方法二:除二法(优化)

方法三.根号法(最优法)


方法一:暴力法

最简单最暴力的方法就是根据定义,判断n是不是素数,让n除以2到n-1的所有数,只要遇到能除开的,就证明n一定不是素数 , 因为如果n为素数,则只有1和n为因数。

​public class Text {
    public static void main(String[] args) {
        System.out.println("请输入一个整数 ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if(n==0||n==1){
            System.out.println(n+"不是素数");
        }
        int i = 2;
        for (; i <= n - 1; i++) {
            if (n % i == 0) {
                System.out.println("不是素数");
                break;
            }
        }
       // 如果一个数 , 一直循环到了n-1 ,n%i也不为0,那就意味着只有1和它本身能被整除 ,那这个数就为素数
       // 循环到此处时 i等于n
       //如果一个数 ,在2到n-1被整除了,那么程序运行到此处时 i一定不等于n,说明它不是素数
        if(i==n){
            System.out.println(n+"是素数");
        }
    }
}

​

 方法二:除二法(优化)

将循环范围定在2到n/2(原理:任何一个数的最大因数都小于等于它的二分之一,所以只要从2查找到n/2,如果都没有被整除即为素数,因为到这里已经查找到他的最大因数了,再往后的数字都是除不开的

eg:30的最大因数为15(能够被三十除近的数只能在1到15 )

     100的最大因数为50

public class Text {
    public static void main(String[] args) {
        System.out.println("请输入一个整数 ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if(n==0||n==1){
            System.out.println(n+"不是素数");
        }
        int i = 2;
        for (; i < n/2; i++) {
            if (n % i == 0) {
                System.out.println(n+"不是素数");
                break;
            }
        }
        if(i>=n/2){
            System.out.println(n+"是素数");
        }
    }
}

方法三.根号法(最优法)

到这里我们发现虽然循环次数减半但不是最优解,而考虑1-根号n时,又缩小了范围,eg:根号17为4.123,而17/2为8.5.

下面具体讲解一下根号法的思路

当我们考虑到根号的情况时,会发现:一个数的两个因数必然会有一个大于根号n , 一个小于根号n

(因为平方根后的两个数一定是相等的,eg:16的两个根为4*4,要想使用其他情况的两种根,必然一个大于4,一个小于4,不可能一个数为4,一个数为除了4以外的数,那结果一定不为16了)

eg:100的因数有:1和100,2和50,4和25,5和20,10和10.只要从2尝试到根号n(也就是10),如果都没有被整除,就是素数,否则就不是。

public class Text {
    public static void main(String[] args) {
        System.out.println("请输入一个整数 ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if(n==0||n==1){
            System.out.println(n+"不是素数");
        }
        int i = 2;
        double tmp=Math.sqrt(n);//注意根号后的结果是double类型
        for (; i < tmp; i++) {//eg:如果temp为3.14,循环到了整数3,也无法整除,那就意味着,这个数是素数i++后就会变成4
            if (n % i == 0) {
                System.out.println("不是素数");
                break;
            }
        }
        if(i>=tmp){//上方说道i++后会变成4,也就是i>temp,即为素数
            System.out.println(n+"是素数");
        }
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值