【Java】如何判断质数、互为质数?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、什么是质数?

首先看下质数的定义:只有两个正因数(1和它本身)的自然数即为质数。(比1大但不是质数的数称为合数。1和0既非质数也非合数。)
举例:
2的因数:1 ,2
3的因数:1,3

二、什么是互为质数

互质数的定义:互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。
举例:
2的因数:1 ,2
3的因数:1,3
我们可以看到2和3的公因数只有1,那么2,3互质。

那么是不是只有两个质数互为质数呢?当然不是,我们可以看到
4的因数:1,2,4
5的因数:1,5
那么3和4的公因数只有1,那么3,4,5互为质数。

根据互质数的定义,可总结出一些规律,利用这些规律能迅速判断一组数是否互质。
(1)两个不相同的质数一定是互质数。如:7和11、17和31是互质数。
(2)两个连续的自然数一定是互质数。如:4和5、13和14是互质数。
(3)相邻的两个奇数一定是互质数。如:5和7、75和77是互质数。
(4)1和其他所有的自然数一定是互质数。如:1和4、1和13是互质数。
(5)两个数中的较大一个是质数,这两个数一定是互质数。如:3和19、16和97是互质数。
(6)两个数中的较小一个是质数,而较大数是合数且不是较小数的倍数,这两个数一定是互质数。如:2和15、7和54是互质数。
(7)较大数比较小数的2倍多1或少1,这两个数一定是互质数。如:13和27、13和25是互质数。

二、使用程序逻辑如何判断是质数

第一种,1到n之间能不能被除了1和它本身之外的数整除。

    public static boolean isPrimeNumber1(int a){
        //0和1既不是质数和不是合数
        if (a < 2 ){
            return false;
        }
        for (int i = 2; i < a; i++) {
            if (a%i == 0){
                return false;
            }
        }
        return true;
    }

第二种,a = b * c;那么b,c一定小于a的平方根;
可以说明,a的其他因数的平方一定小于a.

    public static boolean isPrimeNumber2(int a){
        //0和1既不是质数和不是合数
        if (a < 2 ){
            return false;
        }
        boolean b = true;
        for (int i = 2; i*i < a; i++) {
            if (a%i == 0){
                return false;
            }
        }
        return true;
    }

二、使用程序逻辑如何判断N个数互为质数

根据互为质数可以得到,质数的最大公约数是一,那么用哈希表保存各个因数的累计值,出1以外的因数,其他存在大于1的数,则不互为质数。

    //判断是否互为质数
    public static boolean isPrimeNumberAll(int[] nums){
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (num < 2){
                return false;
            }
            for (int i = 2; i*i <= num; i++) {
                    if (num%i == 0 && set.contains(i)){
                        return false;
                    }else{
                        set.add(i);
                    }
            }
        }
        return true;
    }

二、使用程序逻辑如何判断两个数互为质数

两数互为质数,可以用到求最大公约数是否为1

 //判断是否互为质数
    public static boolean isPrimeNumberTwo(int a ,int b){
        // 辗转相除法
        while (b != 0) {
            int temp = a % b;
            a = b;
            b = temp;
        }

        return a == 1 ? true: false;
    }

如果有错误或更好的方法,欢迎大家指出;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值