image.png
    image.png
    核心:每一个合数都能被小于他的质数分解掉
    代码一步步优化:

    1. public static void main(String[] args) {
    2. System.out.println(eratosthenes2(100));
    3. }
    4. public static int process(int n ){
    5. return -1;
    6. }
    7. public static int eratosthenes2( int n ){
    8. /**标记位,是否位合数*/
    9. boolean[] flag = new boolean[n+1];
    10. int count = 0;
    11. for( int i = 2; i <= n ; i++){
    12. if(flag[i])continue;;
    13. /**把这个判断去掉才是埃筛法的真谛,所有小于他的数在进行倍增的时候,已经把小于当前数的合数给过滤掉了*/
    14. //if(isPrime(i)){
    15. /**倍增过滤掉*/
    16. count++;
    17. /**另一种写法,用加法递增取代乘法。*/
    18. for(int j = i*i ; j<=n; j+=i){
    19. flag[j] = true;
    20. }
    21. //}
    22. }
    23. return count;
    24. }
    25. /**素数,非素数-合数
    26. * 发现一个素数的时候,进行倍增*/
    27. public static int eratosthenes( int n ){
    28. /**标记位,是否位合数*/
    29. boolean[] flag = new boolean[n+1];
    30. int count = 0;
    31. for( int i = 2; i <= n ; i++){
    32. if(flag[i])continue;;
    33. /**把这个判断去掉才是埃筛法的真谛,所有小于他的数在进行倍增的时候,已经把小于当前数的合数给过滤掉了*/
    34. //if(isPrime(i)){
    35. /**倍增过滤掉*/
    36. count++;
    37. for(int j = i; i*j<=n; j++){
    38. flag[i*j] = true;
    39. }
    40. /**另一种写法,用加法递增取代乘法。*/
    41. /**for(int j = 2*i ; j<=n; j+=i){
    42. flag[j] = true;
    43. }*/
    44. //}
    45. }
    46. return count;
    47. }
    48. public static boolean isPrime(int n ){
    49. for(int i = 2; i * i <=n; i++){
    50. if(n%i == 0){
    51. return false;
    52. }
    53. }
    54. return true;
    55. }

    关于复杂度:看看就行了。
    image.png
    为什么埃式筛法的时间复杂度是O(nloglogn)? - 知乎 https://www.zhihu.com/question/35112789