素数是只有1和它本身两个因子的数。判断一个数是不是素数可以通过以下方法:
-
试除法:将这个数除以2到它的平方根之间的每个整数,如果都无法整除,则该数为素数。
-
费马小定理:如果p是素数,a是不被p整除的整数,那么a^(p-1)-1能被p整除。
-
米勒-拉宾素性检验:对于一个整数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;
}
代码解释:
- 引用
stdbool.h
头文件,使用bool
类型代替int
类型的返回值。 isPrime
函数判断输入的正整数n
是否是素数。若小于或等于1,则不是素数;否则从2开始循环,若存在i能整除n,则n不是素数;否则n是素数。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的因数一定已经出现过了,因此不需要再继续循环判断。这一点可以减少代码的运行时间。
二、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中,可以采用枚举法或者试除法来判断一个数是否为素数。
- 枚举法
枚举法是最基本的判断素数的方法,从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;
}
- 试除法
试除法是在枚举法的基础上进行了优化,对于每个数,只需要枚举小于等于其平方根的素数即可。因为如果该数有大于其平方根的因子,那么一定会有小于其平方根的因子。
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实现判断素数的两种方法及代码详解。