(素数筛) 找质数
一天蒜头君猜想,是不是所有的偶数(除了 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\n",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\n",i,m-i); break; } } } return 0; }