质数中的质数(素数筛法)

bool类型真好用

Posted by Zexin Zhang on December 10, 2017

质数中的质数

题目

subtitle

思路

1.纯bool类型数组
2.第一次错误是卡在了循环停止条件,maxlen * maxlen » maxlen,数组开小了
3.第二次错误也是卡在了循环停止条件,sqrt(maxlen)最大情况是maxlen,小了就未覆盖一半的区域

代码部分

#include <cstdio>
#include <cstring>
#include <cmath>
#include <windows.h>
#include <iostream>
#define maxlen 1000001
using namespace std;
int main() {
	int looplen = sqrt(maxlen);
	bool n[maxlen + 100];
	bool m[maxlen + 100];
	memset(n, true, sizeof(n));
	memset(m, true, sizeof(m));
	n[0] = false; n[1] = false;
	for (int i = 2; i <= looplen; i++) {      //一筛
  
		for (int j = i; i*j<=maxlen+10; j++) {
			n[i * j] = false;
		}
	}



	for (int i = 0; i <= (maxlen + 100); i++) //复制
  
		m[i] = n[i];

	int cnt = 0;
	for (int i = 2; i <= maxlen; i++) {       //二筛
  
		if (n[i]) {
			cnt++;
		if (!n[cnt])
			m[i] = false;
		}
	}


	int num;
	scanf("%d", &num);
	for (int i = num; i <= maxlen; i++) {
		if (m[i]) {
			printf("%d\n", i);
			break;
		}
	}

}

运行截图

slo