/*
includi l'header per l'I/O
*/
#include <stdio.h>
/*
crea la funzione esprimo che prende in input un intero
e ne ritorna un altro.
*/
int esprimo(int n)
{
// viene creata ie impostata a 2
// se l'argomento passato vale 2
int i=2;
if (n==2) return 1; // ritorna 1
else
/* se dividento n per 2 troncando i decimali, ottengo lo stesso
valore che dividendolo per 2.0 e quindi tenendo i decimali
(quindi, se n è intero) ritorna il valore 0
*/
if (n/2 == n/2.0) return 0;
// fai partire i da 3 e incrementalo di 2 fino a quando il suo quadrato
// è minore o uguale a n
for (i=3; i*i<=n; i+=2)
/* se dividendo n per i castando implicitamente a intero(e quindi troncando i decimali)
ottengo lo stesso valore che castando a float(e quindi coi decimali) significa
che è intero e quindi ritorno 0.
Rispetto a prima non posso usare il giochino n/2 e n/2.0 visto che i
non è una costante, per fare il controllo su ogni valore del contatore allora
faccio il confronto fra i 2 cast diversi
*/
if (n/i==(float)n/i) return 0;
// se invece arrivo fino a qui, ritorna 1
return 1;
}
/*
funzione principale del programma
*/
main()
{
// dichiara n e i, non inizializzate.
int n,i;
do
{
// richiedi un numero intero pari maggiore di 2
printf("Digita un numero intero pari maggiore di 2: ");
scanf ("%i",&n);
}
// se però n è minore o uguale a 2 o è dispari
// ( n & 1 è un metodo veloce bit-a-bit per verificare se un numero
// è pari o dispari) richiedi il numero
while (n<=2 || n&1);
// parti da 2 e arriva fino alla metà di n
for (i=2; i<=n/2; i++)
// controlla se entrambi i valori delle due chiamate a esprimo sono veri(quindi ritornano un valore diverso da 0, si usa 1 appunto)
if (esprimo(i) && esprimo(n-i))
{
// in questo caso stampa il risultato
printf("%d = %d + %d\n",n,i,n-i);
// e rompi il ciclo, quindi esce
break;
}
// programma terminato correttamente, ritorna 0 al processo chiamante
return 0;
}