筛法求素数

素数之和(筛法求素数)

强颜欢笑 提交于 2020-03-27 05:49:28
1244: 算法提高 素数求和 时间限制: 1 Sec 内存限制: 256 MB 提交: 4 解决: 1 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 输入一个自然数n,求小于等于n的素数之和 输入 2 输出 2 样例输入 2 样例输出 2 提示 数据规模和约定 测试样例保证 2 <= n <= 2,000,000 来源 #include<iostream> #include<string.h> #include<math.h> using namespace std; int a[2000000]={0}; int main() { int n,i,j; cin>>n; for(i=2;i<=2000000;i++) { if(a[i]==1) continue; else { for(j=i+i;j<=2000000;j+=i) { if(j%i==0) a[j]=1;} } } long long int sum=0; for(i=2;i<=n;i++) { if(a[i]==0) { sum+=i; } } cout<<sum<<endl; return 0; } 1244: 算法提高 素数求和 时间限制: 1 Sec 内存限制: 256 MB 提交: 4 解决: 1 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 输入一个自然数 n ,求小于等于 n 的素数之和

筛法求素数的几个模板

て烟熏妆下的殇ゞ 提交于 2020-02-23 11:23:17
定义法 素数可以由定义法求出,即遍历2到sqrt(x)中是否存在能整除x的数,如果存在则不是素数,如果不存在,则是素数,复杂度是O(n)。在数据量小的时候可以使用。 bool isprime(int x) // 判断素数 { if ( x<=1 ) return false; for (int i = 2; i*i<=x; i++) if (x%i==0) return false; return true; } 一般线性筛法 当数量级变大时,如果要找出某个范围内的素数,那么时间复杂度很容易过不去。因此考虑这样一个命题: 若一个数不是素数,则必然存在一个小于它的素数作为其因数。 该命题很容易证明其正确性 所以我们假设已经获得小于一个数x的所有素数,那么判断时就只需要看x是否能被这些素数整除,来判断x是不是素数。 但这样依然需要大量的枚举测试工作,因此换一个角度:当获得一个素数时,即将他所有的倍数均标记为非素数。这样一来,遍历是,如果这个数没有被标记,就说明它就无法被小于它的书整除,则可以认定为素数。 #define MAXSIZE 10001 int Mark[MAXSIZE]; int prime[MAXSIZE]; //判断是否是一个素数 Mark 标记数组 index 素数个数 int Prime(){ int index = 0; memset(Mark,0,sizeof

求素数

纵然是瞬间 提交于 2019-12-25 22:19:31
简单遍历: bool isprime(int n) { int s = sqrt( double(n) )+1; //对n开根号 for(int i=2;i<=s;i++) //n除以每个比n开根号小比1大的自然数 if(n%i==0) //如果有能被整除的,则不是质数 return 0; return 1; } 筛法求素数: 筛法求质数,效率最高,但会比较浪费内存   首先建立一个boolean类型的数组,用来存储你要判断某个范围内自然数中的质数,例如,你要输出小于200的质数,你需要建立一个大小为201(建立201个存储位置是为了让数组位置与其大小相同)的boolean数组,初始化为true。   其次用第二种方法求的第一个质数(在此是2),然后将是2的倍数的数全置为false(2除外),即2、4、6、8……位置上置为false。然后是3的倍数的全置为false(3除外),一直到14(14是200的开平方),这样的话把不是质数的位置上置为false了,剩下的全是质数了,挑着是true的打印出来就行了。 #define N 1000 bool isprm[N]; void isprime() { int i,j,k=0; int s,e=sqrt( double(N) )+1; //sqrt是对于double数开平方 memset(isprm,1,sizeof(isprm));

【筛法求素数】HDU-1239 Calling Extraterrestrial Intelligence Again

夙愿已清 提交于 2019-11-28 16:15:58
注解 1、首先用筛法求100000以内的素数,并找到其个数。 2、在所有找到的素数中,遍历找一个素数对,满足: (1)二者相乘小于等于m; (2)二者相乘是所有满足条件的素数对中的最大的; (3)二者相除大于等于a/b,并且小于等于1 代码 #include <iostream> #include <cstring> using namespace std; const int maxn = 100000; const int len = 9593; int prime[len]; void sieve() { int a[maxn]; int k=0; memset(a, 0, sizeof(a)); for(int i=2; i<maxn; i++) { if(!a[i]) { prime[k++] = i; for(int j=i+i; j<maxn; j+=i) { a[j] = 1; } } } } int main() { sieve(); int m, a, b; cin>>m>>a>>b; while(m || a || b) { int maxnow = -1; int ansa = -1; int ansb = -1; for(int i=0; i<len; i++) { if(prime[i]>m) { break; } for(int j=i; j<len;