- 概念
- 案例
- 求法
素数:即质数
定义:大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数(即除了1和本身没有其他因子)
首先,我们先来看一个数与其因子有什么关系(除了本身的因子)?
因子<=数本身/2
如10 的因子:1、2、5
因为2*5=10 ; 5是10的1/2;如果A因子大于5,则B因子就必须是(1,2)即1和2之间的小数,显然不可能;
所以求素数时只需要将数取模遍历其一半;(当然你也可以遍历到该数的前一位,但是浪费资源不推荐)
例1:输入一个数判断其是否是素数?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
int i = sc.nextInt();
if (isprime(i)){
System.out.println("是素数!");
}else {
System.out.println("不是素数!!");
}
}
public static boolean isprime(int n){
boolean flag=true;
for (int i=2;i<n/2;i++){ //遍历数的一半
if(n%i==0){ // 取模如果等于0,则说明有因子,就不是素数!
flag=false;
}
}
return flag;
}
那就可能有大佬问了 为什么你遍历那里i<n/2
而不是i<=n/2
不是说遍历到一半吗?
咳咳~你想一哈,如果都遍历到了该数1/2的前一位了,它如果是素数肯定在该数的1/2前已经有因子了。
如:数10的1/2是5,要遍历其一半即i=1~5,然后将10%i ,但是i=2的时候已经有因子了,所以无需遍历到5,当然也可以i<=n/2
哈哈
(这么说求素数岂不是有更好的算法?的确,只要求出该数的最小因子即可,emmmm具体本人小白是不太了解了(卑微))
如果是求某个数的所有因子方法可不能这样!!
如:求某个数的所有因子?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//for (int i = 1; i < n/2; i++) 输出没有本身的因子并且如果是偶数没有n/2的因子
//for (int i = 1; i <= n/2; i++) 输出没有本身的所有因子
//for (int i = 1; i < n; i++) 输出没有本身所有因子
for (int i = 1; i <= n; i++) { //输出所有因子包括本身
if (n%i==0){
System.out.println(i);
}
}
}
例2:遍历打印100内的所有素数?
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
if (isprime(i)){ //传入i 然后调用isprime(i)判断i是否是素数,如果为true则进入if语句,打印素数
System.out.println(i);
}
}
}
public static boolean isprime(int n){ //判断素数的方法
boolean b=true;
for (int i=2;i<n/2;i++){
if(n%i==0){ //如果取模有等于0的,说明不是素数
b=false;
}
}
return b;
}
还有i<=Math.sqrt(n)
遍历法求素数,
public static boolean isprime(int n){ //判断素数的方法
boolean b=true;
for (int i=2;i<=Math.sqrt(n);i++){
if(n%i==0){ //如果取模有等于0的,说明不是素数
b=false;
}
}
return b;
}
即遍历到根号下n,然后取模判断即可。前面是遍历到n/2,这里直接是只遍历到√n 明显快了很多。
那又有大佬问小白了,为啥子可以这样嘞??
本小白陷入沉思……
看看下面~
n | √n | n的因子 |
---|---|---|
6 | √6=2 | 1、2、3、6 |
10 | √10=3 | 1、2、5、10 |
20 | √20=4 | 1、2、4、5、10 |
… | … | … |
发现n的因子在√n的左右都有,但是n一定有个因子<=√n;所以我们只需要遍历到√n即可;
其他算法什么的小白这里就木了,告辞