PAT (Basic Level) Practice (中文) B1013 数素数 (20 分)(C++)(两种方法,埃式筛法)

1013 数素数 (20 分)

令 P​i表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 P​M到 PN的所有素数。

输入格式:

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

输出格式:

输出从 PM到 PN 的所有素数,每 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

//埃式筛法
using namespace std;
#include
#include
#include

const int MAX = 1000000;//筛选上界
int Prime[10010] = {
     0};//素数表
int P[MAX] = {
     0};

int main()
{
     
    int M, N, top = 1;
    scanf("%d %d", &M, &N);
    for(int i=2; top<=N; i++)//埃式筛法求素数表
    {
     
        if(!P[i])
        {
     
            Prime[top++] = i;
            for(int j = i+i; j<MAX; j+=i) P[j] = 1;
        }
    }
    for(int i=M, cnt=1; i<N; i++, cnt++)//输出时注意控制格式
    {
     
        if(cnt<10) printf("%d ", Prime[i]);
        else printf("%d\n", Prime[i]), cnt = 0;
    }
    printf("%d", Prime[N]);
	return 0;
}


#include 
#include 
#include 

int main()
{
     
	int M = 0, N = 0;
	int cnt1 = 1, cnt2 = 0;//cnt1用来记录素数的个数;cnt2用来完成10位换行功能
	scanf("%d %d", &M, &N);
	if (M == 1)//把2单独考虑,只有2既是偶数又是素数
	{
     
		printf("2");
		cnt2++;
		if (cnt1 == N) return 0;
	}
	int first = 0;
	for (int i = 3; cnt1 <= N; i+=2)//这里只考虑奇数即可
	{
     
		int flag = 0;
		for (int j = 3; j <= (int)sqrt((double)i); j += 2)//判断是否是素数
		{
     
			if (i%j == 0)
			{
     
				flag = 1;//非素数
				break;
			}
		}
		if (!flag)
		{
     
			cnt1++;
			if (cnt1 >= M && cnt1 <= N)//把第M~第N个素数打印出来,并控制打印格式
			{
     
				cnt2++;
				if (cnt2 == 1) printf("%d", i);
				else if (cnt2 == 10) {
      printf(" %d\n", i); cnt2 = 0; }
				else printf(" %d", i);
			}
		}
	}
	return 0;
}

你可能感兴趣的:(PAT乙级刷题笔记,PAT,乙级,C++)