소감 ¶
2005/02/18 Accepted 0:00.152 448
소수에 대한 기본지식이 없어서 상당히 애를 먹은 문제이다. 2보다 큰 짝수는 모두 두 소수의 합으로 표현될 수 있다. 물론 아직까진 가설이다. 입력 천만기준에 대해 8이상의 모든 수는 소수 4개의 합으로 표현될 수 있다는 전제조건을 세우니 문제가 한결 쉬워 보였다. 왜냐하면 소수 4개의 합이기 때문에 소수중 유일한 짝수인 2를 이용하면 홀수 또한 소수의 합으로 표현할 수 있다. 8보다 작은 수를 제외하곤 모두 소수 4개의 합으로 표현되어진다. 실제로. 정수론에 대해 흥미를 느끼게 해 준 문제였다.
소수에 대한 기본지식이 없어서 상당히 애를 먹은 문제이다. 2보다 큰 짝수는 모두 두 소수의 합으로 표현될 수 있다. 물론 아직까진 가설이다. 입력 천만기준에 대해 8이상의 모든 수는 소수 4개의 합으로 표현될 수 있다는 전제조건을 세우니 문제가 한결 쉬워 보였다. 왜냐하면 소수 4개의 합이기 때문에 소수중 유일한 짝수인 2를 이용하면 홀수 또한 소수의 합으로 표현할 수 있다. 8보다 작은 수를 제외하곤 모두 소수 4개의 합으로 표현되어진다. 실제로. 정수론에 대해 흥미를 느끼게 해 준 문제였다.
소스 ¶
~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; } }