做法:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。
例如 计祘客 找质数题目链接:https://nanti.jisuanke.com/t/A2238
一天蒜头君猜想,是不是所有的偶数(除了 22),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。
输入格式
第一行输入一个整数 tt 表示测试组数。
接下来 tt 行,每行一个整数 nn。
输出格式
输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。
数据范围
对于 30\%30% 的数据 1 \le t \le 10^31≤t≤103。
对于 60\%60% 的数据 1 \le t \le 10^51≤t≤105。
对于 100\%100% 的数据 1 \le t \le 10^6, 4 \le n \le 10^61≤t≤106,4≤n≤106,nn 为偶数。
样例输入
3 4 8 20
样例输出
2 2 3 5 3 17
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
bool vis[N];
int main()
{
int i;
memset(vis,true,sizeof(vis));
for(i = 2; i <= N; i++){
if(vis[i]){
for(int j = i+i; j <= N; j += i){
vis[j] = false;
}
}
}
int n;
scanf("%d",&n);
while(n--){
int x;
scanf("%d",&x);
for(i = 2; i <= x/2; i++){
if(vis[i] == true && vis[x-i] == true){
printf("%d %d\n",i,x-i);
break;
}
}
}
return 0;
}