有两种做法,一种是打表,另一种是直接求。

打表

将1e11每隔len(len=2000w)个数字统计一下该区间内素数的个数,比如cnt[1] 表示[1,len]以内有多少个素数,cnt[2]表示[len+1,2*len】以内有多少个素数,依次类推。

然后维护一下前缀和,sum[i] = cnt[1] + ....+ cnt[i]

那么给定一个数字n,求[1,n]以内有多少个素数, 那么只要统计一下sum[n/len],然后再统计一下区间[n/len*len+1, n/len*len + n%len],由于这个内最多只有2000w个,那么只要对该区间内的数字进行筛法求素数,然后统计该区间内素数的个数就可以了。

任意区间内素数的个数

所以关键是如果求任意区间内素数的个数, 例如要求区间[a, b]内有多少个数字, 因为该区间内任意合数字的最大最小质因数不会超过sqrt(b),所以只要先求出区间[2,sqrt(b)]内的素数表,那么就可以用该素数表去筛去区间[a,b]内的所有合数。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
/** 要求区间[a,b]以内的素数, 那么该区间内所有合数的最小质因数绝对不超过sqrt(b),* 所以只要求出[2,sqrt(b)]以内的所有素数,然后用这些素数筛去区间[a,b]内的所有合数即可* 要开的数组的大小* M > b - a* N > sqrt(b)
*/
const int N = 1000000;
const int M = 10000000;bool is_prime[N];
int prime[N], cnt;
void get_prime(){for(int i=3; i<N; ++i)is_prime[i] = true;cnt = 0;prime[cnt++] = 2;for(LL i=3; i<N; i+=2){if(is_prime[i]){prime[cnt++] = i;for(LL j=i*i; j<N; j+=2*i){is_prime[j] = false;}}}
}bool is_prime2[M];
int get_prime2(LL l, LL r){for(LL i=0; i<=r-l; ++i)is_prime2[i] = true;for(LL i=0; i<cnt && (LL)prime[i]*prime[i]<=r; ++i){/* (l+prime[i]-1)/prime[i]*prime[i] 得到最接近l的prime[i]的倍数是多少 */for(LL j=max(2LL, (l+prime[i]-1)/prime[i])*prime[i]; j<=r; j+=prime[i]){is_prime2[j-l] = false;}}int res = 0;//会把0和1当做素数,所以要减去if(l==0)res -= 2;if(l==1)res -= 1;for(LL i=0; i<=r-l; ++i){res += is_prime2[i];/* printf("%lld %d\n", i+l, is_prime2[i]); */}return res;
}
int main()
{/* freopen("in.txt","r",stdin); *//* freopen("out.txt","w",stdout); */get_prime();cout << get_prime2(1, 10000000) << endl;return 0;
}

转载于:https://www.cnblogs.com/justPassBy/p/5884828.html

求1e11以内的素数相关推荐

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

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

  2. Python求100以内的素数和并输出

    #求100以内的素数并输出 def isPrime(num):for i in range(2,num):if num%i == 0:return Falsereturn True sum = 2#1 ...

  3. 2、求100以内的素数之和。(20分)

    题目: /* 2.求100以内的素数之和.(20分) */ 代码: public class Two207 {public static void main(String[] args) {int s ...

  4. 用筛选法求100以内的素数(数组)

    用筛选法求100以内的素数,要求使用数组. #include "stdafx.h" #include<iostream> using namespace std; in ...

  5. Python练习:求100以内的素数和

    描述 求100以内的素数之和并输出. 输入格式 该题目没有输入 输入输出示例   输入 输出 示例 1 无(红色字体不是OJ的输入) 说明:直接输出100以内的素数之和.(红色字体不是OJ的输出) 代 ...

  6. 一道面试题:用多线程求1000以内的素数有多少个?并给出消耗时间

    我曾经去一个公司面试,遇到这么一个题目:求1000以内的素数有多少个?用多线程实现,并给出消耗时间.我想了半天,没有想出多线程的解决方案.今天因为机缘到了,我浅谈下我的解法. 这道题,显然得考虑两个问 ...

  7. PTA求100以内的素数

    7-3 求100以内的素数 (15 分) 求100以内的全部素数,每行输出10个.素数就是只能被1和自身整除的正整数,1不是素数,2是素数.要求定义和调用函数prime(m)判断m是否为素数,当m为素 ...

  8. 【C语言】 利用筛选法求100以内的素数

    算法思路: 原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数.如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉. 代码如下: //C语言 筛选法求100以内的素 ...

  9. C语言:用筛选法求100以内的素数

    用筛选法求100以内的素数 素数:即质数,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 筛选法:1不是素数,划去:2是素数,留下,将2的倍数划去:3没被划去,将3的倍数划去: ...

最新文章

  1. Linux命令初识一
  2. vr rgb yuv学习资料整理
  3. platform设备驱动全透析
  4. no python interpreter configured
  5. 阿里python面试题和答案_阿里的python大牛总结10条Python面试题陷阱,中招了吗?...
  6. Flex Builder 2 注册码
  7. 【Linux】一步一步学Linux——groups命令(93)
  8. [C]Ubuntu 13.04实现NVIDIA双显卡切换
  9. ECMAScript 6入门 - 变量的解构赋值
  10. UVa11137 Ingenuous Cubrency
  11. 聚类算法——Birch详解
  12. ajax手册看云,下拉菜单Ajax(1.3.3+)
  13. linux驱动初探之字符驱动
  14. php 类别名,关于php:从类别ID laravel获取类别名称
  15. Java常用工具类StringUtils的常用方法
  16. 英伟达显卡不同架构_架构定输赢!盘点历代英伟达显卡能够成功亥市的根源
  17. flash实验中需添加的flash.c文件
  18. 第二章、 Linux 如何学习
  19. 幼儿-综合素质【6】
  20. windows 调试若干知识

热门文章

  1. 无法移动或重命名“Documents and Settings”文件夹
  2. Response.Redirect奇怪现象
  3. 语义分割未来发展如何?
  4. 医学图像分析最新综述:走向深度
  5. 研究做得好,贡献也要大!腾讯AI Lab正式开源业内最大规模多标签图像数据集...
  6. Github出现连接超时
  7. 【python教程入门学习】python值得学吗,怎么自学?
  8. python基础—字典
  9. 重磅开源!新型VOLO打破多项记录!
  10. PyTorch多GPU并行训练方法及问题整理