1、暴力算法:
package eratosthenes;
public class func01 {
public static void main(String[] args){
bf(10);
}
public static int bf(int n){
int count=0;
for(int i=2;i<n;i++){
for(int j=2;j<i;j++)
{
if(i%j==0)count++;
}
}
System.out.println(n-count);
return 0;
}
}
暴力算法另一种形式:
package eratosthenes;
public class func01 {
public static void main(String[] args){
bf(10);
}
public static int bf(int n){
int count=0;
for(int i=2;i<n;i++){
count+=isProme(i)?1:0;
}
System.out.println(count);
return 0;
}
public static boolean isProme(int i){
for(int j=2;j<i;j++)
if(i%j==0) return false;//有可以整除的数,i不是素数
return true;
}
}
暴力稍微优化的版本
package eratosthenes;
public class func01 {
public static void main(String[] args){
bf(100);
}
public static int bf(int n){
int count=0;
for(int i=2;i<n;i++){
count+=isProme(i)?1:0;
}
System.out.println(count);
return 0;
}
public static boolean isProme(int i){
for(int j=2;j*j<=i;j++)//只需要循环到j<根号下i即可,因为2*5和5*2结果都是一样的
if(i%j==0) return false;//有可以整除的数,i不是素数
return true;
}
}
埃筛法:
package eratosthenes;
public class func01 {
public static void main(String[] args){
System.out.println(eratosthenes(100));
}
public static boolean isProme(int i){
for(int j=2;j*j<=i;j++)//只需要循环到j<根号下i即可,因为2*5和5*2结果都是一样的
if(i%j==0) return false;//有可以整除的数,i不是素数
return true;
}
//素数,合数
public static int eratosthenes(int n){
boolean[] isProme=new boolean[n];//建立一个布尔数组判断n是否为合数默认为FALSE,true 代表是合数
int count=0;
for(int i=2;i<n;i++){
if(!isProme[i]){
count++;//判断如果是素数就直接++
//for(int j=2*i;j<n;j+=i){//j是合数的标记位实现2*i;3*i;4*i...找出合数并标记
//但是由于每次内循环使,前几组数据重复获得相同的j因此不用从2开始,直接从i 开始即可
for(int j=i*i;j<n;j+=i){
isProme[j]=true;
}
}
}
return count;
}
}