Count Primes 2018-05-01

204. Count Primes

Prime number 2 3 5 7
以及-上述四个数字的倍数外的
其他数字(非2 3 5 7倍数)

See this link

Sieve of Eratosthenes

My Brute Force

class Solution{
    public static int countPrimes(int n) {
        int count = 0;
        int i, j;
        boolean isPrime;
        if (n <= 2) {
            return 0;
        } // corner case
        else{count++;}
        for (i = n - 1; i > 2; i--) {
            isPrime = true;
            for (j = (int)(Math.ceil(i / 2)); j > 1; j -- ) {
                // System.out.println("i,j = "+i+j);

                if (i % j == 0) {
                    isPrime = false;
                    // System.out.println("break");
                    break;
                }
            }
            if (isPrime == true) {
                count ++; 
            }
        }
        return count; 
    }
}

注意两点:
  1. 怎么处理2: if (n <= 2) {}
  2. less than: i = n - 1
LTE in case:

当n=499979时, Time Limit Exceeded.

Boolean Array解法

通过建立一个bool型数组,从2开始计数,其倍数的数字都赋值为true,显然不是素数。最后统计false的个数即为素数个数。

public class Solution {
    public int countPrimes(int n) {
        boolean[] notPrime = new boolean[n]; // boolean array with size n
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (notPrime[i] == false) {
                count++; // false => Prime => count ++
                for (int j = 2; i*j < n; j++) {
                    notPrime[i*j] = true; // find all multiples of i*j
                }
            }
        }
        
        return count;
    }
}

解释version:


/** 
 * 题意:计算n中的素数个数 
 * 第二种方法 Sieve of Eratosthenes 埃拉托色尼筛法,简称埃氏筛法 
 * By: Eastmount 2015-9-21 
 */   
int countPrimes(int n) {  
    int count;  
    int i,j;  
    bool *nums;  
      
    if(n<=1) return 0;  
      
    //动态数组nums记录是否为素数  
    nums = (bool*)malloc(sizeof(bool)*n);  
    for(i=2; i

// 补充: java如何跳出多层循环

  1. 使用break可以跳出循环,默认情况下是跳出最里层的循环;
  2. 要跳出多层循环怎么办呢,Java替我们已经做好了这一点,就是用 循环标签 :即是对某个循环定义一个名字,然后在 break 后面加上这个名字,当符合 break 条件时,程序就会跳到规定的循环那。
    public static void main(String[] args){  
            lableB:  
            for(int i=0;i<3;i++){  
                lableA:  
                for(int j=0;j<3;j++){  
                    System.out.println(j);  
                    if(j==1){  
                        break lableB;  
                    }  
                }  
            }         
            System.out.println("over!");  
        }  
  • 标签名的命名方法是:java命名规则 和 半角冒号 比如: lableA:

PS:lableB标签的定义需要在使用break lableB语句之前定义。

  • break只跳出当前for循环

  • return是结束当前方法的执行

  • continue是终止当前循环语句的执行,继续下一条循环语句

error

Line 12: error: incompatible types: possible lossy conversion from double to int

            for (j = (int)(Math.ceil(n / 2)); j > 1; j -- ) {

你可能感兴趣的:(Count Primes 2018-05-01)