This problem was asked by Alibaba.

Given an even number (greater than 2), return two prime numbers whose sum will be equal to the given number.

A solution will always exist. See Goldbach’s conjecture.

Example:

Input: 4 Output: 2 + 2 = 4 If there are more than one solution possible, return the lexicographically smaller solution.

If [a, b] is one solution with a <= b, and [c, d] is another solution with c <= d, then [a, b] < [c, d] If a < c OR a==c AND b < d.

My Solution(C++):


#include <iostream>
#include <bits/stdc++.h>

using namespace std;

std::vector<int> goldbachPair(int num){
  std::vector<int> res;
  if (num%2==1 or num<4){
    res = {};
    return res;
  }
  if (num==4 || num==6){
    int n = num/2;
    res = {n, n};
    return res;
  }
  std::vector<int> primes;
  primes.push_back(2);
  for (int i=3; i<num; i++){
    bool is_prime = true;
    for (int p: primes){
      if (p*p > i){
        break;
      }
      if (i%p==0){
        is_prime = false;
        break;
      }
    }
    if (is_prime==true){
      if (std::find (primes.begin(), primes.end(), num-i) != primes.end()){
        res = {num-i, i};
        return res;
      }
      primes.push_back(i);
    }

  }
  return res;
}

int main(){
  std::vector<int> res;
  for (int num=4; num<=100; num+=2){
    cout << "Num = " << num << endl;
    res = goldbachPair(num);
    cout << "Goldbach Pair = " << res[0] << " " << res[1] << endl;
  }
  return 1;
}

My Solution(Python):


def godbachPair(num: int) -> 'list(int)':
    if num%2==1 or num<4:
        return None
    if num==4 or num==6:
        return [num//2, num//2]
    primes = {2}
    for i in range(3, num):
        found = False
        for p in primes:
            if p*p>i:
                break
            if i%p==0:
                found = True
                break
        if found == False:
            if num-i in primes:
                return ([num-i, i])
            primes.add(i)


if __name__=='__main__':
    for num in range(4, 101, 2):
        print(num, godbachPair(num))