Prime number 2 3 5 7
以及-上述四个数字的倍数外的
其他数字(非2 3 5 7倍数)
See this link
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;
}
}
注意两点:
- 怎么处理2: if (n <= 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中的素数个数
* <span style="font-family: Arial, Helvetica, sans-serif;">第二种方法 Sieve of Eratosthenes 埃拉托色尼筛法,简称埃氏筛法</span>
* 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<n; i++) {
//i的倍数均非素数
if(!nums[i]) {
for(j=2; j*i<n; j++) {
nums[j*i] = true;
}
}
}
//计算素数个数
count = 0;
for(i=2; i<n; i++) {
if(nums[i]==false) {
count++;
}
}
free(nums);
return count;
}
// 补充: java如何跳出多层循环
- 使用break可以跳出循环,默认情况下是跳出最里层的循环;
- 要跳出多层循环怎么办呢,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 -- ) {