📌  相关文章
📜  国际空间研究组织 | ISRO CS 2015 |问题 28(1)

📅  最后修改于: 2023-12-03 15:23:03.821000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2015 |问题 28

这道题是一个关于找质数的问题。

题目描述

给定一个正整数n,你需要找到从2到n之间的所有质数。

输入

输入的第一行是一个整数T,表示有T个测试案例。每个测试案例的输入都只有一行,包含一个整数n。

输出

对于每个测试案例,输出从2到n之间的所有质数,每个质数一行。如果从2到n之间没有质数,则输出“-1”。

示例输入
2
5
15
示例输出
2
3
5
2
3
5
7
11
13
解题思路

找质数的算法有很多种,如暴力法、埃式筛法、欧拉筛法等等。这里我们选用欧拉筛法。欧拉筛法的核心思想是:一个数是质数,当且仅当它不能由2至该数平方根范围内的质数相乘得到。因此,我们需要维护一个质数表,先将2至n之间的所有数都当做质数,然后除去每个数的倍数。

代码实现
#include <bits/stdc++.h>
using namespace std;

int prime[1000005], cnt = 0; // prime[]存储质数,cnt表示质数个数
bool vis[1000005]; // vis[]标记当前数是否是质数

void init(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!vis[i]) // 如果i是质数
        {
            prime[cnt++] = i; // 将质数存起来
            for(int j = 2 * i; j <= n; j += i) // 将i的倍数都标记为合数
            {
                vis[j] = true;
            }
        }
    }
}

int main()
{
    int T, n;
    cin >> T;
    while(T--)
    {
        cin >> n;
        cnt = 0;
        memset(vis, false, sizeof(vis)); // vis数组初始化为false
        init(n);
        if(cnt == 0) // 没有质数
        {
            cout << "-1\n";
        }
        else // 有质数
        {
            for(int i = 0; i < cnt; i++)
            {
                cout << prime[i] << endl; // 逐个输出质数
            }
        }
    }
    return 0;
}

以上是符合markdown格式的代码实现。