//java题解,超时版
import java.util.Scanner;
//30分 超时
public class Main {
public static void main(String[] args) {
Scanner sca=new Scanner(System.in);
int t[];
int n;
// n=10000000000;
n=sca.nextInt();
t=new int[n];
for(int i=0;i<n;i++) {
t[i]=sca.nextInt();
}
for(int i=0;i<n;i++) {
int a,b;
out2: for(int j=2;j<=t[i]/2;j++) {
if(j==2) {
a=j;
}
else
for(int k=2;k<j/2;k++) {
if(j%k==0) {
continue out2;
}
}
a=j;
b=t[i]-j;
if(b>2)
for(int k=2;k<b/2;k++) {
if(b%k==0) {
continue out2;
}
}
System.out.println(a+" "+b);
break;
}
}
}
}
//官网满分题解
#include <bits/stdc++.h>
using namespace std;
bool p[1000005];
int main() {
int _;
scanf("%d", &_);
for (int i = 2; i <= 1000000; i++) {
p[i] = true;
}
for (int i = 1; i * i <= 1000000; i++) {
if (p[i]) {
for (int j = i * i; j <= 1000000; j += i) {
p[j] = false;
}
}
}
while (_--) {
int n;
scanf("%d", &n);
for (int i = 2;; i++) {
if (p[i] && p[n - i]) {
printf("%d %d\n", i, n - i);
break;
}
}
}
return 0;
}
分析:我所写的java版本每次都要判断某个数是否为质数,严重加大了程序的负担。若果在最初始的时候就对所有的质数进行标记就可以O(n)的时间复杂度来解决质数的问题。
注意:质数判断时从2开始算起,以i(质数)*i为其实,标记i的所有倍数。依次类推标记n以内的所有非质数。还有就是标记非质数前判断该数是否为质数。非质数的话提前结束循环就可以节省很多时间。