0-1亿里面素数的个数

int sieve()

{

unsigned int*  p=(unsigned int*)malloc(12500000);      // 一个字节8个比特位

memset(p,-1,12500000);

int num=100000000-2;

for(int i=2;i<10000;i++)

{

if(p[i/32]&(1<<i%32))        //  判断第i位是否为1  如果为1 则表明i为素数

{

for(int j=i*i;j<100000000;j+=i)

{

// i的倍数为素数 ,将素数对应得比特位设为0 ,但需先判断该比特位是否为0

if(p[j/32]&(1<<j%32)&&num--)          //  判断第j位是否为1  如果为1 ,num减少一

{

p[j/32] &=(~(1<<j%32))              //  将第j位设置为0

}

}

}

}

free(p);

return  num;

}

时间: 2024-07-31 02:57:30

0-1亿里面素数的个数的相关文章

埃氏筛选 - 素数的个数

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 1000000 + 200; int prime[maxn]; //第i个素数 bool is_prime[maxn + 1]; //is_prime[i]位true, 表示i是素数 void solve(); int sieve

用算法求N(N&gt;=3)之内素数的个数

首先,我们谈一下素数的定义,什么是素数?除了1和它本身外,不能被其他自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 根据素数的定义,在解决这个问题上,一开始我想到的方法是从3到N之间每个奇数进行遍历,然后再按照素数的定义去逐个除以3到 根号N之间的奇数,就可以计算素数的个数了. 于是便编写了下面的代码: (代码是用C++编写的) #include<iostream> #include <time.h> using namespace std; #define N 1

区间内素数的个数

2016.1.26 试题描述 给定两个正整数 a 和 b,请你统计区间 [a,b) 内有多少个素数. 输入 共一行包含两个正整数 a 和 b,用一个空格分隔开. 输出 一个数,表示所给区间内的素数的个数. 输入示例 22 37 输出示例 3  其他说明 数据范围:1≤ a < b ≤ 10^12 , b-a ≤ 10^7 .样例说明:有23. 29 和 31 共 3 个素数. 区间筛嘛~随便筛~就是当年写的代码比较难看?_? #include<iostream> #include<

埃氏筛法(快速筛选n以内素数的个数)

给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n以内的素数就略显吃力了. 要是求n以内的素数个数的话,可以用埃式筛选.预处理一下. 先看下面的代码: 1 /* 2 |埃式筛法| 3 |快速筛选素数| |15-7-26| 4 */ 5 #include <iostream> 6 #include <cstdio> 7 using na

《挑战程序设计竞赛》 大区间内素数的个数

题意: 给一个区间边界值很大的区间,但是区间大小较小,求出该区间内所有质数个数. 知识补充: 因数枚举:分解一个数n,至于要从1 枚举到 n??√ 即可,然后把i和 n / i 当做因数加入vector 整数分解(把一个整数枚举出其质数基连乘的形式):从2开始枚举质数基,然后每次把该整数尽可能的被当前质数除去最大次数,这样该整数就会变小,极大减少枚举量.注意和map搭配使用,记录每一个质数的个数. 埃式素数筛法的复杂度是:Ologlogn看做线性也无妨. 求区间[a,b)内素数的个数,由于b的最

求小于10000的素数的个数 Exercise06_10

1 /** 2 * @author 冰樱梦 3 * 时间:2018年下半年 4 * 题目:求小于10000的素数的个数 5 * 6 */ 7 public class Exercise06_10 { 8 public static void main(String[] args){ 9 int sum=0; 10 for(int i=1;i<=1000;i++){ 11 if(isPrime(i))sum++; 12 } 13 System.out.println("1000以内素数的个数

G - Non-Prime Factors Kattis - nonprimefactors (筛1-n内的当前数中非素数的个数)

题目链接: G - Non-Prime Factors  Kattis - nonprimefactors 题目大意:给你一个数n,然后问你n的因子中非素数的个数. 具体思路:埃筛,把每一个数的因子直接算出来就好了. AC代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e6 + 100; 4 int vis[maxn]; 5 int sto[maxn]; 6 void init() 7 { 8 f

查找2-n之间素数的个数

题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n之间素数的个数 样例输入 Copy 14 样例输出 Copy [2-14] prime numbers: 6 提示 注意输出字符串的内容和格式 def prime(x): j=2 while j<x: if x % j==0: break j+=1 if j==x: return True else

wenbao与网络赛(百亿内素数)

@ 求1到一百亿之内的素数个数 http://acm.hdu.edu.cn/showproblem.php?pid=5901 @  复杂度大概O(n^(3/4)) 1 //G++ 1560ms 6544k 2 #include <bits/stdc++.h> 3 #define ll long long 4 using namespace std; 5 ll f[340000],g[340000],n; 6 void init(){ 7 ll i,j,m; 8 for(m=1;m*m<=