PAT (Basic Level) Practice1013 数素数

1013 数素数

一、题目

P i P_i Pi 表示第 i i i 个素数。现任给两个正整数 M ≤ N ≤ 1 0 4 M≤N≤10^4 MN104,请输出 P M P_M PM P N P_N PN 的所有素数。

二、输入输出

输入格式

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

输出格式

输出从 P M P_M PM P N P_N 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

四、题目分析

本题可以采取逐个判断素数的方式获得第i个素数,输出给定范围的素数。由于M、N的范围有限,可以采取筛选法求素数。全局变量num[SIZE]元素的值为1表示其下标为素数,0表示其下标为合数(不包括0、1)。数组的大小定义为 1 0 6 10^6 106

五、代码

#include 
#define SIZE 1000000
using namespace std;
int num[SIZE];
int main()
{
     
    int n;         //读入N
    int m;         //读入M
    int count = 0; //素数计数
    int flag = 0;  //控制格式
    cin >> n >> m;
    for (int i = 2; i < SIZE; i++)
        num[i] = 1;
    for (int i = 2; i < SIZE; i++)
        if (num[i]) //i是质数
            for (int j = i + i; j < SIZE; j += i)
                num[j] = 0;
    for (int i = 2; i < SIZE; i++)
        if (num[i]) //i是质数
        {
     
            count++;
            if (count < n)
                continue;
            else if (count > m)
                break;
            else
            {
     
                if (flag != 0)
                    if (flag % 10 == 0)
                        cout << '\n';
                    else
                        cout << ' ';
                flag++;
                cout << i;
            }
        }
    return 0;
}

六、总结

  • 筛选法求素数:

    筛选法求素数适用于给定范围的情况,首先从2开始,去掉所有2的倍数(自身除外),这里去掉的操作是把数组元素置为0。然后把下一个元素(质数)的倍数去掉,直到剩余全为质数。

    for (int i = 2; i < SIZE; i++)
    	if (num[i]) //i是质数
    		for (int j = i + i; j < SIZE; j += i)
    			num[j] = 0;
    

你可能感兴趣的:(算法,#,PTA,c++,算法,PTA,oj系统,素数)