Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cmath>
- #include <iostream>
- using namespace std;
- int esPrimo (int num) {
- /* Funcion que me dice si un numero es o no primo */
- int i;
- for (i = 2; i <= sqrt(num); i++)
- if (num % i == 0)
- return 0;
- return 1;
- }
- /*
- int masCercano(int num) {
- La use para buscar otro metodo de generar la suma de primos. Tambien sirve
- pero provoca TIME LIMIT
- int i ;
- for (i = 3; i < num; i+=2)
- if (esPrimo(num - i))
- return i;
- return 0;
- }*/
- void generarPar(int num) {
- /* Un par siempre puede ser escrito como 2 + 2 + ALGO.
- Si mi numero a escribir era 12, deje 12 como 2 + 2 + 8
- y ahora a partir del 8 busque el primer numero primo que
- restado a 8 daba la diferencia prima. En este caso 3.
- 8 - 3 = 5 y cinco es primo.
- Asi que escribia 2 + 2 + 3 + 5
- Fin al problema.
- */
- int i,nuevoNum;
- int valor;
- nuevoNum = num - 4;
- for (i = 3; i < num; i+=2)
- if(esPrimo(i)) {
- valor = nuevoNum - i;
- if (esPrimo(valor)) {
- printf("2 2 %d %d\n",i,valor);
- break;
- }
- }
- }
- void generarImpar(int num) {
- /* Idem al anterior con la diferencia que escribia la suma
- como 2 + 3 */
- int i,nuevoNum;
- int valor;
- nuevoNum = num - 5;
- for (i = 3; i < num; i+=2)
- if(esPrimo(i)) {
- valor = nuevoNum - i;
- if (esPrimo(valor)) {
- printf("2 3 %d %d\n",i,valor);
- break;
- }
- }
- }
- int main () {
- int numero;
- while (cin >> numero) {
- if (numero < 8)
- printf("Impossible.\n");
- else if (numero == 8)
- printf("2 2 2 2\n");
- else if (numero == 9)
- printf("2 3 2 2\n");
- else{
- if (numero%2 == 0)
- generarPar(numero);
- else
- generarImpar(numero);
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment