Oppure

Loading
07/01/07 19:55
chigi
Ciao a tutti..avrei bisogno di una mano nel commentare questo programma passo per passo..Grazie


#include <stdio.h>

int esprimo(int n)
{
int i=2;
if (n==2) return 1;
    else
if (n/2 == n/2.0) return 0;
    for (i=3; i*i<=n; i+=2)
        if (n/i==(float)n/i) return 0;
    return 1;
}

main()
{
int n,i;
do
{
    printf("Digita un numero intero pari maggiore di 2: ";);
    scanf ("%i",&n);
    }
while (n<=2 || n&1);
for (i=2; i<=n/2; i++)

if (esprimo(i) && esprimo(n-i))
    {printf("%d = %d + %d\n",n,i,n-i);
break;
}

    return 0;
}
aaa
08/01/07 20:06
netarrow
una mano... ho usato tutte e 10 le dita :asd:

/*
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; 
}
Ultima modifica effettuata da netarrow 08/01/07 20:10
aaa
09/01/07 19:10
chigi
GRazie! ora è tutto + chiaro :k:
aaa