找两个质数和为偶数的两个数
一天蒜头君猜想,是不是所有的偶数(除了 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<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1e6+10; int prim[maxn], w[maxn], cnt = 0;//prim[i]起标记作用,prim[i]==0表示i是质数 int x[maxn];//x[i]表示偶数是i的符合条件的两个质数是x[i]和i-x[i]; void init() { memset(x, 0, sizeof(x)); memset(prim, false, sizeof(prim)); for(int i = 2; i < maxn; i++) { if(prim[i]) //判断i是否为偶数 continue; w[cnt++] = i;//w存质数 for(int j = i << 1; j < maxn; j+=i)//把所有质数的倍数标记 prim[j] = true; } x[4] = 2; for(int i = 6; i < maxn; i+=2)//偶数 { for(int j = 1; j < cnt && i > w[j]; j++)//筛选符合条件的质数 { if(!prim[i-w[j]]) { x[i] = w[j]; break; } } } } int main() { init(); int t; scanf("%d", &t); while(t--) { int n; scanf("%d", &n); printf("%d %d\n",x[n], n-x[n]); } return 0; }
等风起的那一天,我已准备好一切