素数判定【暴力法】
在学习git的同时创建了一个github仓库,代码在这里,指路。
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; }