提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、什么是质数?
首先看下质数的定义:只有两个正因数(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;
}
如果有错误或更好的方法,欢迎大家指出;