第一种:典型求法

#include<bits/stdc++.h>
using namespace std;int main()
{int n,f;cin >> n;int cnt = 0;for (int i = 2; i <= n; i++){f=1;for(int j = 2; j <=sqrt(i); j++){if(i%j==0){f=0;break;}}if(f){//cout << i << endl ;cnt++;}}cout << cnt<< endl;return 0;
}

第二种:埃拉托色尼筛选法
数据量大的话,所用空间较大

#include<bits/stdc++.h>typedef long long ll;
using namespace std;
const int N = 1e6 + 100;bool vis[N];int main()
{int n;cin >> n;vis[1]=1;for (int i = 2; i <= n; i++){if (vis[i]) continue;for (int j = i + i; j <= n; j += i)//j可以优化从从i*i开始vis[j] = 1;}int cnt = 0;for (int i = 1; i <= n;i++)if (vis[i] == 0) {//cout << i << endl ;cnt++;}cout << cnt<< endl;return 0;
}

第三种:欧拉筛法

#include <bits/stdc++.h>
using namespace std;vector<int> Prime(int n){  // 求解n以内(含n)的素数bool flag[n + 1];   // 标记数组,flag[i]==0表示i为素数,flag[i]==1表示i为合数memset(flag, 0, sizeof(flag));vector<int> prime;int cnt = 0;    // 素数个数for (int i = 2; i <= n; ++i) {if (!flag[i]) {prime.push_back(i); // 将i加入素数表cnt++;}for (int j = 0; j < cnt; ++j){ // 保证每个合数只会被它的最小质因数筛去if (i * prime[j] > n)  break;flag[i * prime[j]] = 1;if (i % prime[j] == 0)  break;}}return prime;
}
int main(int argc, char const *argv[])
{int n;while(1) {printf("请输入n,将输出n以内(含n)的素数:");scanf("%d", &n);if(n < 0) break;vector<int> prime = Prime(n);int cnt = prime.size();printf("一共有%d个素数:\n", cnt);for(int i = 0; i < cnt; i++) {printf("%3d ", prime[i]);if(i % 10 == 9) puts("");}puts("\n");}return 0;}

第三种:Meisell-Lehmer 模板
这个是我偶然看到的网上的,自己也没仔细看呢,先放在这个合辑里
这个算法好像是时间空间复杂度都不大

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 5e6 + 2;
bool np[N];
int prime[N], pi[N];int getprime() {int cnt = 0;np[0] = np[1] = true;pi[0] = pi[1] = 0;for(int i = 2; i < N; ++i) {if(!np[i]) prime[++cnt] = i;pi[i] = cnt;for(int j = 1; j <= cnt && i * prime[j] < N; ++j) {np[i * prime[j]] = true;if(i % prime[j] == 0)   break;}}return cnt;
}
const int M = 7;
const int PM = 2 * 3 * 5 * 7 * 11 * 13 * 17;
int phi[PM + 1][M + 1], sz[M + 1];
void init() {getprime();sz[0] = 1;for(int i = 0; i <= PM; ++i)  phi[i][0] = i;for(int i = 1; i <= M; ++i) {sz[i] = prime[i] * sz[i - 1];for(int j = 1; j <= PM; ++j) {phi[j][i] = phi[j][i - 1] - phi[j / prime[i]][i - 1];}}
}
int sqrt2(LL x) {LL r = (LL)sqrt(x - 0.1);while(r * r <= x)   ++r;return int(r - 1);
}
int sqrt3(LL x) {LL r = (LL)cbrt(x - 0.1);while(r * r * r <= x)   ++r;return int(r - 1);
}
LL getphi(LL x, int s) {if(s == 0)  return x;if(s <= M)  return phi[x % sz[s]][s] + (x / sz[s]) * phi[sz[s]][s];if(x <= prime[s]*prime[s])   return pi[x] - s + 1;if(x <= prime[s]*prime[s]*prime[s] && x < N) {int s2x = pi[sqrt2(x)];LL ans = pi[x] - (s2x + s - 2) * (s2x - s + 1) / 2;for(int i = s + 1; i <= s2x; ++i) {ans += pi[x / prime[i]];}return ans;}return getphi(x, s - 1) - getphi(x / prime[s], s - 1);
}
LL getpi(LL x) {if(x < N)   return pi[x];LL ans = getphi(x, pi[sqrt3(x)]) + pi[sqrt3(x)] - 1;for(int i = pi[sqrt3(x)] + 1, ed = pi[sqrt2(x)]; i <= ed; ++i) {ans -= getpi(x / prime[i]) - i + 1;}return ans;
}
LL lehmer_pi(LL x) {if(x < N)   return pi[x];int a = (int)lehmer_pi(sqrt2(sqrt2(x)));int b = (int)lehmer_pi(sqrt2(x));int c = (int)lehmer_pi(sqrt3(x));LL sum = getphi(x, a) + LL(b + a - 2) * (b - a + 1) / 2;for (int i = a + 1; i <= b; i++) {LL w = x / prime[i];sum -= lehmer_pi(w);if (i > c) continue;LL lim = lehmer_pi(sqrt2(w));for (int j = i; j <= lim; j++) {sum -= lehmer_pi(w / prime[j]) - (j - 1);}}return sum;
}int main() {init();LL n;cin >> n ;cout << lehmer_pi(n) << endl;return 0;
}

求1~n中素数个数的几种方法C/C++相关推荐

  1. Java求两集合中元素交集的四种方法对比总结

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑 ...

  2. php时间戳求时间差,php中计算时间差的几种方法

    您可能感兴趣的话题: php 核心提示:在php中计算时间差有时候是件麻烦的事!不过只要你掌握了日期时间函数的用法那这些也就变的简单了. 在php中计算时间差有时候是件麻烦的事!不过只要你掌握了日期时 ...

  3. 用c语言求1 n的素数个数 给出两种解法,【题目】求n以内的素数个数

    最近在leetCode上刷提,还是满锻炼人的,为以后面试打基础吧.不多说下面开始. 问题:求[2,n]之间的素数的个数. 来源:leetCode OJ 提示: Let's start with a i ...

  4. 【引用】在VB6.0中实现弹出式菜单的几种方法

    在Windows应用程序中,利用弹出式菜单(Pop-up Menu)是增加软件易用性的一个重要方式.本文将向大家介绍在VB6.0中实现弹出式菜单的几种方法. 利用VB6.0内置的PopupMenu方法 ...

  5. 素数判断的几种方法代码实现及其复杂度分析

     素数判断的几种方法代码实现及其复杂度分析  原文链接:http://blog.csdn.net/infinitezhen/article/details/8961964 一. 朴素判断素数 根据素数 ...

  6. mysql添加临时索引_mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  7. python去重复排序_Python实现删除排序数组中重复项的两种方法示例

    本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...

  8. 剑指offer——面试题9:求斐波那切数列的四种方法

    剑指offer--面试题9:求斐波那切数列的四种方法 另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333 总结下求 ...

  9. java字符串统计字母个数_java8 统计字符串字母个数的几种方法总结(推荐)

    1.统计字符串字母个数(并且保持字母顺序) 比如: aabbbbbbbba喔喔bcab cdabc deaaa 目前我做知道的有5种方式噢,如果你还有更好的,欢迎赐教 //方式1 public sta ...

最新文章

  1. 【Python】if __name__ == ‘__main__‘:的作用和原理
  2. JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
  3. 零式机器人_最帅机器人作品“EVA”“天元突破”谁才是男人真正的浪漫
  4. 强烈推荐《价值:我对投资的思考》
  5. citrix+netscaler配置第一次培训
  6. latex 编辑文档遇到的问题
  7. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
  8. idea 设置默认 jdk
  9. run (简单DP)
  10. mysql 中like怎么用_mysql中like怎么用?
  11. 什么是JavaSE,写给第一次接触Java的人
  12. java 判断客户端是手机端还是PC端(SSH框架)
  13. HDU 5857 Median (推导)
  14. specification java_使用JPA实现Specification规范模式 -解道Jdon
  15. 命令行如何 copy 文件内容到剪切板(clipboard)?
  16. 几种常见电源防反接设计
  17. 老男孩--你记得当初的梦想吗
  18. Android6.0权限
  19. 【Mermaid 语法详细教程 01】 流程图(Flowchart / graph)
  20. 探讨魔兽dota改建原理

热门文章

  1. blinker点灯开关组件
  2. Java 程序基本结构
  3. 蓝色经典钢琴-Cinesamples Piano In Blue v2.3b Kontakt
  4. android动态请求权限
  5. Android post参数太长请求失败问题解决
  6. 普通人如何通过积分落户北京? 2021北京积分落户分析必看
  7. 线性时不变系统——信号系统学习笔记
  8. Elo Rating System 简介及其在游戏中的运用
  9. 我的世界1.12.2java下载_我的世界java版整合包
  10. RPA技术可行性方案确认-辅助手册