第一种方法 The Sieve of Eratosthenes is one of the most efficient ways to find all prime numbers up to n.

The Sieve of Eratosthenes uses an extra O(n) memory and its runtime complexity is O(n log log n)

创建一个length = n的boolean数组 isPrime,每个元素初始化为true;

k = 2:(n-1),如果当前数k是prime,把 k^k - (n-1)/k *k的数 对映的 isPrime = false;

最后计算 从2到n-1 isPrime == true的个数。

代码:

public class Solution {
public int countPrimes(int n) {
boolean[] isPrimes = new boolean[n];
for(int i = 0; i < isPrimes.length; i++){
isPrimes[i] = true;
}

for(int k = 2; k <= (n-1)/k; k++){
if(isPrimes[k] == true){
for(int i = k; i <= (n-1)/k; i++){
isPrimes[i*k] = false;
}
}
}
int count = 0;
for(int i = 2; i< isPrimes.length; i++){
if(isPrimes[i] == true) count++;
}
return count;
}
}

还可以用DP来解决。

public class Solution {
public int countPrimes(int n) {

int count = 0;
int squareRoot = 1;
int number = 2;

List<Integer> list = new ArrayList<>();
for(int i = number; i < n; i++){
boolean isPrime = true;
if(squareRoot * squareRoot < i) squareRoot++;
for(int j = 0; j < list.size() && list.get(j) <= squareRoot;j++){
if(i%list.get(j) == 0){
isPrime = false;
break;
}
}
if(isPrime == true){
list.add(i);
count++;
}
}
return count;
}
}

Runtime: O(n*sqrt(n)/log(n))

最后,记录下最原始的求prime的方法 0-sqrt(n):

public class Solution {
public int countPrimes(int n) {

int count = 0;
int squareRoot = 1;
int number = 2;

for(int i = number; i < n; i++){
boolean isPrime = true;

for(int divisor = 2; divisor <= (int) (Math.sqrt(i)) ; divisor++){
if(i%divisor == 0){
isPrime = false;
break;
}
}
if(isPrime == true){
count++;
}
}
return count;
}
}

转载于:https://www.cnblogs.com/5683yue/p/5118239.html

Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;相关推荐

  1. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  2. HDU 3336 Count the string(KMP+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题意:给你一个字符串,计算其所有前缀在该字符串出现的次数的总和. 思路:next[j]=i,代表 ...

  3. hdu 4472 Count(递推即dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472 代码: #include <cstdio> #include <cstring ...

  4. USACO 2008 Jan Gold 3.Cell Phone Network 树形dp

    本题的大意就是在一棵树上选一些节点,被选中的节点可以覆盖他相 邻的点,问最少需要放几个节点\text{本题的大意就是在一棵树上选一些节点,被选中的节点可以覆盖他相 邻的点,问最少需要放几个节}\\\t ...

  5. CF 1625C. Road Optimization(DP)

    Linking 题意: 在一条直线道路从A到走向B点,A点位于0位置,B点位于m位置. 道路上有n个时速牌,第i个牌上标有ai,表示从该时速牌到下一时速牌这段距离中,每走一个位置耗时ai分钟.(初始位 ...

  6. Jan 09 - Number of 1 Bits; Bit Operation;

    和 reverse Bits同一类型 代码: public class Solution { // you need treat n as an unsigned value public int r ...

  7. 2019.02.09 bzoj4455: [Zjoi2016]小星星(容斥原理+dp)

    传送门 题意简述:给一张图和一棵树(点数都为n≤17n \le17n≤17),问有多少种给树的标号方法方法使得图中去掉多余的边之后和树一模一样. 思路: 容斥好题啊. 考虑fi,jf_{i,j}fi, ...

  8. 可截断素数(Truncatable primes)

    可截断素数是当从一端连续删除数字时,得到的仍旧是素数的一个素数. 举例 997是左截短素数,因为997, 97 和 7 都是素数. 7393是右截断素数,因为7393, 739, 73 和 7 都是素 ...

  9. Codeforces757E.Bash Plays With Functions(积性函数 DP)

    题目链接 \(Description\) q次询问,每次给定r,n,求\(F_r(n)\). \[ f_0(n)=\sum_{u\times v=n}[(u,v)=1]\\ f_{r+1}(n)=\s ...

最新文章

  1. 精彩碰撞!神经网络和传统滤波竟有这火花?
  2. Codeforces Round #601 (Div. 2)D. Feeding Chicken,二维压一维,几何平面的分配
  3. android 保存textview,为什么没有TextView(带ID)会自动保存它的状态?
  4. [转]verilog语法学习心得
  5. .net 无法通过嵌套类型访问外部类型的非静态成员-解决方案
  6. awk的正则表达式提取
  7. 利用规则引擎计算个人所得税学习
  8. python编程爱因斯坦的问题_教你如何用编程解决爱因斯坦的数学问题
  9. Python学习笔记 setdict
  10. 第六次作业—例行报告
  11. 关于大数据和互联网的一点想法
  12. ubuntu14.04 解决屏幕亮度无法调节的问题
  13. 上海杨浦|2022年杨浦 “ 创业之星 ” 大赛
  14. 千锋教育python老师_千锋老师分享Python经典面试题
  15. 当心长角怪生物...闪动你的招牌...
  16. 关于如何开启本地代理隐藏本地ip
  17. java后端根据经纬度获取地址(高德地图)
  18. ubuntu20.04 使用root用户登录系统
  19. 校园邮箱申请JetBrains账户(用于激活clion/ pycharm)
  20. <必知>在腾讯云买了服务器后不知道登录密码,如何重置密码

热门文章

  1. filters获取data中的数据
  2. Java并发编程之ConcurrentLinkedQueue详解
  3. Win10错误代码0x80070541是怎么回事
  4. 2019-06-02 Java学习日记之多线程上
  5. Linux内核模块自动加载机制 .
  6. 内存二三事: Xcode 内存图、Instruments 可视化检测循环引用
  7. 《图解HTTP》学习笔记
  8. Cocos2dx源码记录(6) CCTrianglesCommand
  9. maven install 没反应
  10. Ripple(Glance)