algoritmi e C++?

salve,

sono alle prime armi con algoritmi e C++, potreste aiutarmi con questi due esercizi? grazie mille..

1. Scrivere un programma C che prende in input un numero N e restituisce in output il numero dei divisori di N e la lista di tali divisori.

Esempio: con N=6 in input il programma deve restituire 4 (numero dei divisori) e i numeri 1, 2, 3, 6 (lista dei divisori)

2. Una pianta cresce ogni mese in base alla seguente regola

a) nel primo mese cresce della metà dell’altezza iniziale

b) nei mesi successivi cresce della metà di quanto è cresciuta il mese precedente

Scrivere un programma C che prende in input l’altezza iniziale H e il numero di mesi M e restituisce in output l’altezza finale della pianta.

3 risposte

Classificazione
  • exProf
    Lv 7
    3 mesi fa
    Migliore risposta

    A) "Scrivere un programma C che ..." te lo lascio tutto a te; per imparare a fare algoritmi C e/o Pascal sono poco adatti.

    Inoltre se ti mostro un còdice già scritto tu non hai incentivo a consultare manuali e a usare un compilatore.

    ------------------------------

    B) "Ideare un algoritmo che ..." mi sembra un còmpito più adatto a vedere la lògica del processo di calcolo, la sua espressione algoritmica e a memorizzarla in modo che in futuro la si possa rammentare come esempio per eventuali analogie.

    Un còdice pronto da compilare si rammenta con difficoltà.

    Dal punto di vista della codifica le prove di un algoritmo si fanno codificàndolo come una funzione che gènera i risultati richiesti usando solo i dati pertinenti e senza toccare lo stato dell'ambiente che la attiva.

    La funzione è attivata da un MAIN che si occupa delle interazioni con l'ambiente esterno: ricicla sull'acquisire l'input fino a che esso non soddisfà alle precondizioni dell'algoritmo; attiva la funzione e ne riceve i risultati; li comunica all'ambiente di output.

    ==============================

    ESERCIZIO #1

    Generare la lista L dei divisori naturali di un dato N naturale e la sua lunghezza n.

    ------------------------------

    NOTAZIONI

    * "divmod(dividendo, divisore) = (quoziente, resto)" per la divisione euclidea su una sola linea

    * "L = []" per la lista vuota

    * "len(L)" per avere il numero di elementi nella lista L

    * "L + L1" per accodare alla lista L tutti gli elementi di L1

    * "L.append(x)" per accodare alla lista L il solo elemento x

    * "L.sort()" per commutare gli elementi della lista L in ordine non decrescente

    ------------------------------

    ALGORITMO

    Assodato che il valore di N ricevuto sia un naturale si inizializzano i risultati ponendo

    * n = 2

    * L = [1, N]

    Le prove di divisibilità si conducono da due a metà di N: per ogni resto zero si accodano ad L divisore e quoziente e s'incrementa n di due.

    La prima prova (prova = 2) dà la parità di N.

    * mezzo, resto = divmod(N, 2)

    Se resto = 0, allora N è pari: si accoda ad L la lista [2, mezzo]; s'incrementa n di due.

    Si pone limite = mezzo - 1.

    Le prove successive sono da tre a limite, estremi compresi.

    ------------------------------

    SCHEMA

    1) Se N non è un intero positivo: TERMINARE con un codice d'errore.

    2) Porre prova, n, L = 2, 2, [1, N]

    3) Porre mezzo, resto = divmod(N, prova)

    4) Se resto > 0: PROSEGUIRE dal punto 5

    4a) Porre L = L + [prova, mezzo]

    4b) Porre n += 2

    5) Se prova >= mezzo: TERMINARE con la coppia di risultati (n, L).

    6) Porre prova += 1

    7) Porre quoziente, resto = divmod(N, prova)

    8) Se resto > 0: PROSEGUIRE dal punto 9

    8a) Porre L = L + [prova, quoziente]

    8b) Porre n += 2

    9) PROSEGUIRE dal punto 6

    ==============================

    ESERCIZIO #2

    Una pianta cresce ogni mese in base alla seguente regola [l'altezza iniziale è h(0) = H]

    a) nel primo mese cresce della metà dell'altezza iniziale [h(1) = H + H/2 = 3*H/2]

    b) nei mesi successivi cresce della metà di quanto è cresciuta il mese precedente (la differenza fra le due altezze)

    [h(m + 1) = h(m) + (h(m) - h(m - 1))/2 = (3/2)*h(m) - (1/2)*h(m - 1)]

    Ideare un algoritmo che calcoli h(H, m).

    ------------------------------

    ALGORITMO

    La successione {a(k)}, definita ricorsivamente da

    * (a(0) = A) & (a(1) = 3*A/2) & (a(k + 1) = (3/2)*a(k) - (1/2)*a(k - 1))

    ha la forma chiusa

    * a(k) = A*(2*2^k - 1)/2^k

    ---------------

    Riportata ai simboli del problema diventa

    * h(H, m) = H*(2*2^m - 1)/2^m

    ---------------

    NON CREDO CHE TI SERVANO ULTERIORI DETTAGLI PER UNA SOLA FORMULA.

  • 3 mesi fa

    1 - diciamo che il metodo più facile è prendere il numero, dividerlo per tutti i numeri tra 1 e n e stampare quelli che lo dividono esattamente (vedi comando modulo).

    Questa è fondamentalmente l'unica via, però possiamo studiare un po' più a fondo la cosa e capire alcuni trucchetti per limitare i confronti.

    Per esempio, ogni numero è divisibile per 1 e per sé stesso, quindi senza fare confronti possiamo stampare 1 all'inizio e n alla fine, cominciando a contare i divisori da 2.

    Nessun numero ha un divisore (tranne sé stesso) maggiore di n/2, quindi possiamo dimezzare i confronti andando da 2 a n/2. E fin qui va bene.

    Però possiamo migliorare ancora, se il numero è dispari, allora non serve confrontarlo con nessun numero pari, perché qualsiasi numero pari moltiplicato per un numero qualsiasi dà un numero pari. Se un numero n è divisibile per x, allora è divisibile anche per n/x, quindi ogni volta che trovi un divisore, in realtà ne trovi due.2 - è una semplice serie numerica h+h*sommatoria con i che va da 1 a m di 1/2^iQuindi 3 mesi è h+h*(1/2+1/4+1/8), se h è 100 cm, quindi abbiamo 100+100*(1/2+1/4+1/8), quindi 100+50+25+12.5 = 187.5 cmin pratica 

    tassoCrescita = 1;

    for (int i = 1; i <= m; i++) tassoCrescita+=1/pow(2,i);

    h+=h*tassoCrescita.

  • Anonimo
    3 mesi fa

    Divisori:

    #include <stdio.h>

    #include <stdlib.h

    main()

    {

        int num,nd=1;

        int conta, r, contar;

        system("cls");

        printf("\n\n0 - termina.");

        do

        {

         printf("inserire un numero intero: ");

         scanf("%d",&num);

        }while(num<=0);

        printf("divisori di %d:\n",num);

        conta=2;

        contar=1;

        printf("   %d\n",1);

        while (conta<=num)

        {

              r=num%conta;

              if (r==0)

              {

               nd++;

               contar++;

               printf("   %d\n",conta);

                 if (contar==6)

                   {

                       printf("\n\n");

                        contar=0;

                    };

               };

             conta++;

        }

        printf("\nNumero divisori trovati: %d\n",nd);

        system("pause");

    }

    Crescita pianta:

    #include <stdio.h>

    main()

    {

        float hi,cr;

        int m,i;

        printf("\nInserisci l'altezza iniziale: ");

        scanf("%f",&hi);

        printf("\nInserisci i mesi: ");

        scanf("%d",&m);

        cr = hi;

        hi = hi/2;

        cr += hi;

        for(i=2;i<=m;i++)

        {

          hi /= 2;

          cr += hi;

        }

        printf("\nAltezza attuale %3.3f",cr);

    }

Altre domande? Fai una domanda e ottieni le risposte che cerchi.