[C++]伯俊9020号黄金バッハの推測


質問する
1より大きい自然数のうち、1と自身を除いて約数のない自然数を少数と呼ぶ.例えば、5は、1と5を除いて約数がないため、少数である.ただし、6=6=2× 3なので少数ではありません.
金バッハの推測は有名な整数論の未解問題であり,2より大きいすべての偶数は2つの素数の和として表すことができる.この数を金バッハ数と呼ぶ.また,偶数を2素数の和として表す式を数の黄金バッハパーティションと呼ぶ.例えば、4=2+2、6=3+3、8=3+5、10=5+5、12=5+7、14=3+11、14=7+7である.10000以下のすべての偶数nについて、黄金バッハパーティションが存在する.
2より大きい偶数nが与えられた場合、nの黄金バッハパーティションを出力するプログラムを作成します.可能なn個のゴールドバッハパーティションが複数ある場合、出力の2つの少数の差が最小である.
入力
第1行は、試験例の個数Tを与える.各試験例は1行で構成され、偶数nが与えられる.
しゅつりょく
各テストケースについて、所与のn個のゴールドバッハパーティションを出力する.出力された小数点は先に出力され、スペースで区切られます.
制限
4 ≤ n ≤ 10,000
に答える
エラトネスのふるいを用いて,まず4~10000の範囲の小数を求め,prime配列に格納する.
2つの小数の差は最小にしなければならないので、入力値の半分によって-1+1を繰り返し、両方が小数であれば大丈夫です.
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#define endl '\n'

using namespace std;

int n;

int prime[10000];

void eratos(){
  for (int i=2; i<10000; i++)
    prime[i] = 1;

  for (int i=2; i<=100; i++)
    if (prime[i])
      for (int j=i*i; j<10000; j+=i)
        prime[j] = 0;
}

int solve(int num){
  for (int x = num/2; x>0; x--)
    if (prime[x] && prime[num-x])
      return x;
}

int main(){
  ios_base :: sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  // ifstream cin;
  // cin.open("input.txt");

  cin >> n;

  eratos();

  for (int i=0; i<n; i++){
    int num;
    cin >> num;
    int x = solve(num);
    int y = num - x;
    cout << x << " " << y << endl;
  }

}