素数判定【暴力法】

总纲指路链接

1、暴力法(O(n))

1.1 算法描述:

假设要判断n是否为素数(判断n是否还有除1和本身之外的因子),该方法的主要思路就是从2开始遍历到n-1,查看是否可以被n整除,如果找到一个可以整除,那么n为合数;如果没有找到可以整除的,那么n为素数。

1.2 算法实现(C++):

#include<stdio.h>
#include <iostream>
using namespace std;

bool isPrime_1(int n){
    int i;
    for(i=2;i<n;i++){
        if(n%i==0) return 0;
    }
    return 1;
}

int main(){
    int n;
    bool res;
    printf("Please enter a number to determine whether it's a prime number.\n");
    scanf("%d",&n);
    res = isPrime_1(n);
    if(res) printf("%d is a prime num.\n",n);
    else printf("%d isn't a prime num.\n",n);
}

2、暴力法改进1(O(n½))

2.1 算法描述:

我们知道,如果一个数可以进行因数分解,那么分解时得到的两个因数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可。代码可以改为如下的过程,提高效率。

2.2 算法实现(C++):

#include<stdio.h>
#include<math.h>
#include <iostream>
using namespace std;

bool isPrime_2(int n){
    int i;
    int tmp = int(sqrt(n))+1;
    for(i=2;i<=tmp;i++){
        if(n%i==0&&n!=2) return 0;
    }
    return 1;
}

3、暴力法改进2(O(n½/2))

3.1 算法描述:

我们还可以进一步在剩余的sqrt(n)中减少一些需要遍历的数,首先判断n是不是2的倍数,如果是2的倍数,那么肯定是合数;如果不是2的倍数,那么仅需要遍历3-sqrt(n)中的奇数即可,减少了一半的量。

3.2 算法实现(C++):

#include<stdio.h>
#include<math.h>
#include <iostream>
using namespace std;

bool isPrime_3(int n){
    if(n==2) return 1;
    else if(n%2==0) return 0;
    
    int i;
    int tmp = int(sqrt(n))+1;
    for(i=3;i<=tmp;i+=2){
        if(n%i==0) return 0;
    }
    return 1;
}

猜你喜欢

转载自www.cnblogs.com/from-zero/p/12978940.html