Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Goldbach
Forum - C/C++ - Goldbach

Avatar
chigi (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/12/2006

Segnala al moderatore
Postato alle 20:55
Domenica, 07/01/2007
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;
}

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:06
Lunedì, 08/01/2007
una mano... ho usato tutte e 10 le dita :asd:

Codice sorgente - presumibilmente C++

  1. /*
  2. includi l'header per l'I/O
  3. */
  4. #include <stdio.h>
  5.  
  6. /*
  7. crea la funzione esprimo che prende in input un intero
  8. e ne ritorna un altro.
  9.  
  10. */
  11. int esprimo(int n)
  12. {
  13. // viene creata ie impostata a 2
  14. // se l'argomento passato vale 2
  15. int i=2;
  16.  if (n==2) return 1;  // ritorna 1
  17.  else
  18. /* se dividento n per 2 troncando i decimali, ottengo lo stesso
  19.   valore che dividendolo per 2.0 e quindi tenendo i decimali
  20.   (quindi, se n è intero) ritorna il valore 0
  21. */
  22.  if (n/2 == n/2.0) return 0;
  23. // fai partire i da 3 e incrementalo di 2 fino a quando il suo quadrato
  24. // è minore o uguale a n
  25.  for (i=3; i*i<=n; i+=2)
  26. /* se dividendo n per i castando implicitamente a intero(e quindi troncando i decimali)
  27.    ottengo lo stesso valore che castando a float(e quindi coi decimali) significa
  28.    che è intero e quindi ritorno 0.
  29.    Rispetto a prima non posso usare il giochino n/2 e n/2.0 visto che i
  30.    non è una costante, per fare il controllo su ogni valore del contatore allora
  31.    faccio il confronto fra i 2 cast diversi
  32. */
  33.  if (n/i==(float)n/i) return 0;
  34.  
  35. // se invece arrivo fino a qui, ritorna 1
  36.  return 1;
  37. }
  38.  
  39.  
  40. /*
  41. funzione principale del programma
  42. */
  43. main()
  44. {
  45.  
  46. // dichiara n e i, non inizializzate.
  47. int n,i;
  48.  
  49.  do
  50.  {
  51.  // richiedi un numero intero pari maggiore di 2
  52.  printf("Digita un numero intero pari maggiore di 2: ");
  53.  scanf ("%i",&n);
  54.  }
  55.  // se però n è minore o uguale a 2 o è dispari
  56. // ( n & 1 è un metodo veloce bit-a-bit per verificare se un numero
  57. // è pari o dispari) richiedi il numero
  58.  while (n<=2 || n&1);
  59.  
  60.  
  61. // parti da 2 e arriva fino alla metà di n
  62.  for (i=2; i<=n/2; i++)
  63.  
  64. // controlla se entrambi i valori delle due chiamate a esprimo sono veri(quindi ritornano un valore diverso da 0, si usa 1 appunto)
  65.  if (esprimo(i) && esprimo(n-i))
  66.  {
  67.  // in questo caso stampa il risultato
  68. printf("%d = %d + %d\n",n,i,n-i);
  69. // e rompi il ciclo, quindi esce
  70.  break;
  71.  }
  72.  
  73.  // programma terminato correttamente, ritorna 0 al processo chiamante
  74.  return 0;
  75. }


Ultima modifica effettuata da netarrow il 08/01/2007 alle 21:10
PM Quote
Avatar
chigi (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/12/2006

Segnala al moderatore
Postato alle 20:10
Martedì, 09/01/2007
GRazie! ora è tutto + chiaro :k:

PM Quote