求1e11以内的素数
有两种做法,一种是打表,另一种是直接求。
打表
将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以内的素数相关推荐
- 用c语言求1 n的素数个数 给出两种解法,【题目】求n以内的素数个数
最近在leetCode上刷提,还是满锻炼人的,为以后面试打基础吧.不多说下面开始. 问题:求[2,n]之间的素数的个数. 来源:leetCode OJ 提示: Let's start with a i ...
- Python求100以内的素数和并输出
#求100以内的素数并输出 def isPrime(num):for i in range(2,num):if num%i == 0:return Falsereturn True sum = 2#1 ...
- 2、求100以内的素数之和。(20分)
题目: /* 2.求100以内的素数之和.(20分) */ 代码: public class Two207 {public static void main(String[] args) {int s ...
- 用筛选法求100以内的素数(数组)
用筛选法求100以内的素数,要求使用数组. #include "stdafx.h" #include<iostream> using namespace std; in ...
- Python练习:求100以内的素数和
描述 求100以内的素数之和并输出. 输入格式 该题目没有输入 输入输出示例 输入 输出 示例 1 无(红色字体不是OJ的输入) 说明:直接输出100以内的素数之和.(红色字体不是OJ的输出) 代 ...
- 一道面试题:用多线程求1000以内的素数有多少个?并给出消耗时间
我曾经去一个公司面试,遇到这么一个题目:求1000以内的素数有多少个?用多线程实现,并给出消耗时间.我想了半天,没有想出多线程的解决方案.今天因为机缘到了,我浅谈下我的解法. 这道题,显然得考虑两个问 ...
- PTA求100以内的素数
7-3 求100以内的素数 (15 分) 求100以内的全部素数,每行输出10个.素数就是只能被1和自身整除的正整数,1不是素数,2是素数.要求定义和调用函数prime(m)判断m是否为素数,当m为素 ...
- 【C语言】 利用筛选法求100以内的素数
算法思路: 原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数.如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉. 代码如下: //C语言 筛选法求100以内的素 ...
- C语言:用筛选法求100以内的素数
用筛选法求100以内的素数 素数:即质数,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 筛选法:1不是素数,划去:2是素数,留下,将2的倍数划去:3没被划去,将3的倍数划去: ...
最新文章
- Linux命令初识一
- vr rgb yuv学习资料整理
- platform设备驱动全透析
- no python interpreter configured
- 阿里python面试题和答案_阿里的python大牛总结10条Python面试题陷阱,中招了吗?...
- Flex Builder 2 注册码
- 【Linux】一步一步学Linux——groups命令(93)
- [C]Ubuntu 13.04实现NVIDIA双显卡切换
- ECMAScript 6入门 - 变量的解构赋值
- UVa11137 Ingenuous Cubrency
- 聚类算法——Birch详解
- ajax手册看云,下拉菜单Ajax(1.3.3+)
- linux驱动初探之字符驱动
- php 类别名,关于php:从类别ID laravel获取类别名称
- Java常用工具类StringUtils的常用方法
- 英伟达显卡不同架构_架构定输赢!盘点历代英伟达显卡能够成功亥市的根源
- flash实验中需添加的flash.c文件
- 第二章、 Linux 如何学习
- 幼儿-综合素质【6】
- windows 调试若干知识