一天蒜头君猜想,是不是所有的偶数(除了 2),都可以用两个质数相加得到呢?
输入格式
第一行输入一个整数 t 表示测试组数。
接下来 t 行,每行一个整数 n。
输出格式
输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。
数据范围
对于 30%的数据 1<=t<=10^3
对于 60% 的数据 1<=t<=10^5
对于 100% 的数据 1<=t<=10^6,4<=n<=10^6,n 为偶数。
解法一:用素数筛打表存入数组,遍历时,判断 i 和 n-i 是不是素数就比较方便(AC)
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
bool p[1000005];
int main() {
int n;
int m;
scanf("%d",&n);
for(int i=2;i<=1000000;i++){
p[i]=true;
}
for(int i=2;i*i<=1000000;i++){ //素数筛打表
if(p[i]){
for(int j=i*i;j<=1000000;j+=i){
p[j]=false;
}
}
}
while(n--){
scanf("%d",&m);
for(int i=2;;i++){
if(p[i]&&p[m-i]){ //只要某数 i 和 m-i都为质数 则为结果所求
printf("%d %d
",i,m-i);
break;
}
}
}
return 0;
}
解法二:用30%的数据在10^3,暴力破解可以通过部分。
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
bool prime(long x){ //判断素数
for(int i=2;i*i<=x;i++){
if(x%i==0) return false;
}
return true;
}
int main() {
int n;
int m;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
for(int i=2;;i++){
if(prime(i)&&prime(m-i)){ //遍历1到m,判断i 和 m-i是不是素数
printf("%d %d
",i,m-i);
break;
}
}
}
return 0;
}
