~cpp // no10168 - SumOfFourPrimes(a) #include <iostream> #include <cmath> using namespace std; const int MAX = 450; void setPrimeArr(int * prim); bool findPrim(int formerPrim, bool isEven, int * prim); void showPrime(int prime1, int prime2, bool isEven); int main() { int number; int primes[MAX] = {2, 3, 5, 7, 11, 13,}; setPrimeArr(primes); while (cin >> number) { if (number < 8) cout << "Impossible."; else if (number % 2 != 0) { cout << "2 3 "; findPrim(number - 5, false, primes); } else if (number % 4 == 0) findPrim(number/2, true, primes); else { findPrim(number/2 - 1, false, primes); findPrim(number/2 + 1, false, primes); } cout << endl; } return 0; } bool findPrim(int formerPrim, bool isEven, int * prim) { bool success; int prime1, prime2; for (int i=0; i < MAX; i++) { prime1 = prim[i]; prime2 = formerPrim - prime1; success = true; for (int j=0; j < MAX; j++) { if(prime2 > prim[j] && prime2 % prim[j] == 0) { success = false;; break; } } if (success) { showPrime(prime1, prime2, isEven); break; } } return true; } void showPrime(int prime1, int prime2, bool isEven) { cout << prime1 << " " << prime2 << " "; if (isEven) cout << prime1 << " " << prime2; } void setPrimeArr(int * prim) { int countPrimes = 6; bool boolPrimes; for (int i=15; ; i+=2) { boolPrimes = true; for (int j=3; j <= sqrt(i); j+=2) { if (i % j == 0) { boolPrimes = false; break; } } if(boolPrimes) prim[countPrimes++] = i; if (countPrimes > MAX) break; } }