判断素数算法实现

素数是只有1和它本身两个因子的数。判断一个数是不是素数可以通过以下方法:

  1. 试除法:将这个数除以2到它的平方根之间的每个整数,如果都无法整除,则该数为素数。

  2. 费马小定理:如果p是素数,a是不被p整除的整数,那么a^(p-1)-1能被p整除。

  3. 米勒-拉宾素性检验:对于一个整数n,令n-1=d·2s,其中d为奇数,a是2到n-2的一个随机整数,如果ad mod n = 1或者存在一个r(0<=r<=s-1),使得a((2r)·d) mod n = -1,则n可能是一个素数,重复进行这个测试k次,如果每次测试都返回n是一个素数的结果,那么n就被认为是一个素数。

以上是判断素数的常见方法,但对于特别大的数,可能需要更复杂的算法。

在这里插入图片描述

一、C 实现判断素数及代码详解

素数,也称质数,是指只能被1和本身整除的正整数。以下是C语言实现判断素数的代码:

#include <stdio.h>
#include <stdbool.h>

bool isPrime(int n) {
    
    
    if(n <= 1) {
    
    
        // 1不是素数
        return false;
    }
    for(int i=2; i*i<=n; i++) {
    
    
        if(n % i == 0) {
    
    
            // 若n能被i整除,则n不是素数
            return false;
        }
    }
    return true;
}

int main() {
    
    
    int n;
    printf("请输入一个正整数:");
    scanf("%d", &n);
    if(isPrime(n)) {
    
    
        printf("%d是素数\n", n);
    } else {
    
    
        printf("%d不是素数\n", n);
    }
    return 0;
}

代码解释:

  1. 引用stdbool.h头文件,使用bool类型代替int类型的返回值。
  2. isPrime函数判断输入的正整数n是否是素数。若小于或等于1,则不是素数;否则从2开始循环,若存在i能整除n,则n不是素数;否则n是素数。
  3. main函数中读入一个正整数n,调用isPrime函数进行判断,输出结果。

在循环中,仅需判断 i 2 i^2 i2是否大于 n n n,是因为如果 i 2 i^2 i2大于 n n n i i i n n n的因数一定已经出现过了,因此不需要再继续循环判断。这一点可以减少代码的运行时间。

扫描二维码关注公众号,回复: 17144890 查看本文章

二、C++ 实现判断素数及代码详解

判断素数是指判断一个数是否为质数,即只能被 1 和本身整除的数。以下是 C++ 实现判断素数的代码:

#include <iostream>
#include <cmath>
using namespace std;

bool is_prime(int n) {   // 判断素数函数
    if (n <= 1) return false;   // 如果小于等于1,则不是素数
    int sqr = sqrt(n);          // 计算n的平方根
    for (int i = 2; i <= sqr; i++) {
        if (n % i == 0) return false;  // 如果n能被i整除,则不是素数
    }
    return true;  // 否则是素数
}

int main() {
    int n;
    cout << "请输入一个正整数:";
    cin >> n;
    if (is_prime(n)) {
        cout << n << " 是素数" << endl;
    } else {
        cout << n << " 不是素数" << endl;
    }
    return 0;
}

以上代码中,主要的函数是 is_prime(),用于判断一个数是否为素数。首先判断特殊情况,即输入的数小于等于 1,直接返回 false。然后计算输入数的平方根,并从 2 开始到平方根进行循环,判断能否被整除,如果能,直接返回 false。最后返回 true,表示输入的数是素数。

在主函数中,首先是从键盘输入一个正整数 n,然后调用 is_prime() 函数进行判断,如果是素数,输出结果,“n 是素数”,否则输出 “n 不是素数”。

通过以上 C++ 实现判断素数的代码,我们可以更好的理解素数的定义及判断方法。

在这里插入图片描述

三、Java 实现判断素数及代码详解

素数指只能被1和自身整除的数。在Java中,可以采用枚举法或者试除法来判断一个数是否为素数。

  1. 枚举法

枚举法是最基本的判断素数的方法,从2开始一直枚举到该数的平方根,如果存在该数的因子,则该数不是素数;否则该数是素数。

Java代码实现如下:

public static boolean isPrime(int num) {
    
    
    if (num <= 1) {
    
    
        return false;
    }
    for (int i = 2; i <= Math.sqrt(num); i++) {
    
    
        if (num % i == 0) {
    
    
            return false;
        }
    }
    return true;
}
  1. 试除法

试除法是在枚举法的基础上进行了优化,对于每个数,只需要枚举小于等于其平方根的素数即可。因为如果该数有大于其平方根的因子,那么一定会有小于其平方根的因子。

Java代码实现如下:

public static boolean isPrime(int num) {
    
    
    if (num <= 1) {
    
    
        return false;
    }
    if (num == 2 || num == 3) {
    
    
        return true;
    }
    if (num % 6 != 1 && num % 6 != 5) {
    
    
        return false;
    }
    for (int i = 5; i <= Math.sqrt(num); i += 6) {
    
    
        if (num % i == 0 || num % (i + 2) == 0) {
    
    
            return false;
        }
    }
    return true;
}

这里使用了6k-1和6k+1规律来进行优化,即一个数为素数当且仅当它是6k-1或6k+1的形式。这个规律的优化可以减少一半的遍历次数。

以上就是Java实现判断素数的两种方法及代码详解。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47225948/article/details/133124907
今日推荐