(素数筛) 找质数

一天蒜头君猜想,是不是所有的偶数(除了 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;
}
posted @ 2020-03-02 22:48  Maxwell·  阅读(174)  评论(0编辑  收藏  举报