JAVA实现循环判断素数(简单方法及代码优化)

什么是素数?

        素数又称为质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

利用JAVA实现:

思路:

首先输入一个大于一的正整数n;

再根据素数的定义 除了自己本身和1之外没有因数 即从2 到n-1;

利用for循环 从2除到n-1 利用if语句判断 若在此过程中除余为零 则此数不是素数,若除到n-1还没有出现除余为零的情况 则此数为素数;

若要实现循环判断 则使用while(scanner.hasNestInt() ) ;

代码实现:

import java.util.Scanner;

public class test1 {
    public static void main(String[] args) {
        System.out.println("请输入一个大于1的整数:");
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            int n = scanner.nextInt();//输入一个整数n
            int i = 2;//从2开始除
            for (;i<n;i++){ //除到n-1结束 i自增到n-1后会再自增一次 i=n循环结束
                if (n % i == 0){
                    System.out.println("不是素数");
                    break;
                }
            }//此时i自增到n 即i=n 除到了自己本身 则其一定为素数
            if (i==n)
                System.out.println("是素数");
        }

    }
}

这里注意:

for循环中 i=n才会结束循环,所以i到n-1时满足循环条件 会在自增一次到n 才结束循环;

第二个if语句不能写在for循环体内 要等i除到n-1 结束循环之后自增到n;

代码优化:

如果输入的数字更大呢?岂不是要除很多数字?比如10000 就一定要除到9999吗?

我们发现一个数可以表示为n = a*b  例如16 =1x16 2x8 ... 4x4 ..... 8x2 ...................... 16x1;   
                                                                              1      2     3    4 ......... 8  .........................16
                                数字n找因子 只需找到一半 即n/2 
                              例如 17= 1x17 ....................................................17x1;
                                找到一半 没有因子 则其后半部分也没有因子 其为素数
        实现:
            for( ; i <= n/2 ; i++){      //  n遍历的范围缩小到 2到n/2 
                if ( n % i == 0){
                    System.out.println("不是素数");
                    break;
                }
            }
            if ( i > n/2){       // 此时遍历到n/2时没有因子 则其为素数
                System.out.println("是素数");
            }
 

再次缩小范围 找到根号n
        实现:
            for( ; i <= Math.sqrt(n) ; i++){      //  n遍历的范围缩小到 2到根号n
                if ( n % i == 0){
                    System.out.println("不是素数");
                    break;
                }
            }
            if ( i > Math.sqrt(n) ){       
                System.out.println("是素数");
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值