B1013 数素数(20分)

B1013 数素数(20分)

\(P​_i\)表示第 i 个素数。现任给两个正整数 \(M≤N≤10^4\),请输出 \(P_M\)\(P_N\)的所有素数。

输入格式:

输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:

输出从 \(P_​M\)\(P_N\)的所有素数,每 10 个数字占 1行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

思考

这个问题是否需要筛法?
我觉得是需要的,因为10的4次方已经很大了,是素数的个数达到10的4次方。
算法笔记上说,筛法和非筛法都可以解决问题。
那么首先用非筛法试一下。
前100009个数有9593个素数。所以这里用不用筛法,都可以解决问题前1000009有78499个素数;
每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
怎么办?这种输出形式。
给出第4个测试点答案错误的代码

#include<cstdio>
#include<cstring>
#include<cmath>
const int MAXN=100009;
int prime[MAXN], pNum = 0;
bool p[MAXN] = {0};
bool isPrime(int n){
	if(n<=1) return false;
	int sqr=(int)sqrt(1.0*n);
	for(int i=2;i<=sqr;i++){
		if(n%i==0) return false;
	}
	return true;
}

void Find_Prime(){
	for(int i = 1; i<MAXN;i++){
		if(isPrime(i) == true){
			prime[pNum++] = i;
			p[i] = true;
		}
	}
}
int main(){
	Find_Prime();
	int M,N;
	int enter=0; 
	scanf("%d %d", &M, &N);
	for(int i=M-1;i<N-1;i++){
		printf("%d",prime[i]);
		enter++;
		if(enter!=10){
			printf(" ");
		}
		else {
			printf("\n");
			enter = 0;
		}
	}
	printf("%d",prime[N-1]);
}

不断扩大打表范围
终于在扩大到
const int MAXN=110050;时候AC掉了,估计是最大的极限的素数10的4次方的。

posted @ 2019-01-19 15:59  lingr7  阅读(244)  评论(3编辑  收藏  举报