Numero semiprimo

Gemma ha appena imparato che cos’è un numero semiprimo, e presa dall’euforia non riesce a smettere di parlarne.
In particolare, un numero semiprimo è un intero ≥2 che si fattorizza come prodotto di due numeri primi (non necessariamente distinti).

I numeri primi sono tutti quegli interi ≥2 divisibili solo per se stessi e per 1.

Sono quindi esempi di numeri semiprimi i numeri:

  • 15, prodotto di 3 e 5.
  • 169, prodotto di 13 e 13.

Aiuta Gemma a scrivere un programma che verifichi se un numero N è semiprimo oppure no!

Dati di input

Il file input.txt contiene l’unico intero N, di cui Gemma vuole verificare la semiprimalità.

Dati di output

Il file output.txt contiene:

  • I due primi che fattorizzano N, stampati su un’unica riga, in ordine non-decrescente, se N è semiprimo.
  • L’unico intero −1 se N non è semiprimo.

Assunzioni

  • 2 ≤ N ≤ 1000000.

Esempi di input/output

input.txt output.txt
961 31 31
884053 101 8753
16 -1

Note

  • Per chi usa Pascal: è richiesto che si utilizzi sempre il tipo di dato longint al posto di integer.
  • Un programma che stampa lo stesso output indipendentemente dal file di input non totalizza alcun punteggio.

/*  
    www.valcon.it/
	OII 2015 - Fase territoriale - NUMERO SEMIPRIMO
*/

#include 
#include 
 
long N;
long P, P1, P2;

int primo(long x)
{
	long ultimo=(long)sqrt(x);
	
	for(long i=2; i <= ultimo; i++)
	    if(x%i == 0)
	    {
	    	P=i;
	        return 0;
	    }
	return 1;        
}

int main()
{     
    FILE *fin =fopen( "input.txt", "r");  
    FILE *fout=fopen("output.txt", "w");
   
	fscanf(fin, "%ld", &N);    		
	
    if(primo(N))			
	    fprintf(fout, "-1\n");
    else
    {
    	P1=P;
    	P2=N/P;
        if(primo(P1) && primo(P2))         
            fprintf(fout, "%ld %ld\n", P1,P2);
        else                  
            fprintf(fout, "-1\n");
    }
    return 0;
}