@
素数:只能被自己和1整除的数
brute force 暴力解法
public class Prime{
// 判断一个数是不是质数
public boolean isPrime(int num){
for(int i=2;i<num;++i){
if(num%i==0){
return false;
}
}
return true;
}
public static int numOfPrime(num){
int res=0;
for(int i=1;i<num;++i){
if(isPrime(i)){
res++;
}
}
return res;
}
public static void main(String[]args){
int num=100000000;
int result=numOfPrime(num);
System.out.println("the prime num is:"+result+"of "+num);
}
}
埃拉托斯特尼筛法_埃氏筛法求素数
算法步骤
-
1.先列出2数字之后的所有元素 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
-
2.标记序列中第一个未标记的素数 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
-
3.把素数2后面序列中2的倍数除掉 2,3,5,7,9,11,13,15,17,19,21,23,25
-
4.当前序列中最大的数小于最后标记素数的平方,序列中所有数都是素数;如果大于的话,继续执行步骤2,3,4;
(2^2=4 < 25) 重复步骤2
2,3,5,7,9,11,13,15,17,19,21,23,25(步骤2)
2,3,5,7,11,13,17,19,23,25(步骤3)
(3^2=9 <25)
2,3,5,7,11,13,17,19,23,25(步骤2)
2,3,5,7,11,13,17,19,23(步骤3)
(5^2=25> 23)
结果为:
2,3,5,7,11,13,17,19,23
埃氏筛法-算法实现
public class CountPrime{
public static int prime(int num){
// 默认都是0,素数
int[] arr=new int[num];
arr[1]=1;
arr[2]=0; // 标记是否为素数
double boundary=Math.sqrt(num+0.5);
//验证步骤4
for(int i=2;i<boundary;++i){
if(arr[i]==0){
// 步骤3
for(int j=i*i;j<num;j=j+i){
arr[i]=1;
}
}
}
int res=0;
for(int i=0;i<num;++i){
if(arr[i]==0){
res++;
}
}
return res;
}
public static void main(String[] args){
int num=100000000;
int count=prime(num);
System.out.println(count);
}
}
public static void main(String[] args) {
System.out.println(getZS(10000000));
}
///获取质数个数
public static int getZS(long n) {
int result = 0;
for (int i = 1; i <= n; i++) {
if(isPrime(i))
result++;
}
return result;
}
/// 高效判断是否为质数
public static boolean isPrime(long num)
{
if (num < 2)
return false;
if (num == 2 || num == 3)
{
return true;
}
if (num % 6 != 1 && num % 6 != 5)
{
return false;
}
int sqr = (int)Math.sqrt(num);
for (int i = 5; i <= sqr; i += 6)
{
if (num % i == 0 || num % (i + 2) == 0)
{
return false;
}
}
return true;
}