📅  最后修改于: 2023-12-03 15:23:03.821000             🧑  作者: Mango
这道题是一个关于找质数的问题。
给定一个正整数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格式的代码实现。