Algoritmo

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
all'universita' venerdi hanno spiegato il ciclo while quindi e' tanto se so come funziona il for, purtrioppo molte cose del codice non le conosco, avrei preferito una dritta detta in "parole"
Se vi siete stufati vi capisco
Come scritto da @rctimelines , il problema si risolve con due cicli.
Se puoi calcolare un prodotto mediante sole addizioni(sommi uno dei due fattori tante volte quanto l'altro) e se puoi calcolare una potenza come serie di prodotti, allora puoi calcolare una potenza anche con sole addizioni.

Per esempio 3^5 si può scrivere nel seguente modo:3^5 = 3x3x3x3x3 = (((3x3)x3)x3)x3
Il ciclo interno semplifica di volta in volta una parentesi, partendo dalla più interna.
Calcolato 3x3=3+3+3=9, la variabile risultato assume il valore di 9.
A questo punto il ciclo interno riparte usando 9 come fattore e sempre 3 come secondo fattore (che è la base, usata come limite al for interno) e calcola 9x3=9+9+9, il risultato di 27 è poi scritto dentro la variabile risultato.
Nuovamente il ciclo interno riparte usando 27 e 3 come fattori calcolando 27x3=27+27+27 = 91
E così via per un totale di volte pari all'esponente meno 1 (ovvero pari al numero di moltiplicazioni).
 
Grazie per le risposte che purtroppo non sono servite a farmi arrivare alla soluzione, ho chiesto ad altri miei 2 collghi di incontrarci per provarci insieme, ma non ci siamo riusciti neanche insieme, neanche leggendo i vostri aiuti (siamo scarsoni ahaha) ho capito che ci sono 2 cicli for ma non ho capito cosa scrivere nel primo e nel secondo, dalle prove noi abbiamo fatto un primo ciclo che si ripete un tot di volte pari all'elevazione a potenza (ma nel ciclo non ho inserito nessun calcolo), il ciclo piu interno si ripete un numero di volte pari al numero di base, e contiene la somma di quest'ultimo per se stesso, comunque alla fine non ci risulta, il prof in realta' non l'aveva assegnato ma io l'ho visto nelle slide e ho voluto provare a farlo, quindi ancora non ho una soluzione, con questi 2 commenti ho capito "QUASI" come fare ma purtroppo non sono stati abbastanza

Il risultato della potenza di un numero naturale a (a>0) elevato all'esponente n si può trovare anche con x = e^(n*ln(a)), utilizzando cioè funzioni trascendenti quali il logaritmo e l'esponenziale :sisi:
Il punto è sempre quello: quando ti trovi di fronte ad un problema la prima cosa da fare è quella di comprenderlo a fondo, al fine della scelta del migliore procedimento risolutivo (se preferisci, della struttura dati più adatta) ;)
Dovendo, ad esempio, calcolare l'M.C.D. (esempio classico che cito spesso) tra 2 numeri interi utilizzando l'algoritmo di Euclide per la sua risoluzione (te lo lascio come esercizio, una alternativa potrebbe essere quella di implementare l'operazione di moltiplicazione tramite addizioni ripetute), la prima domanda da porsi è la seguente: cosa significa calcolare l'M.C.D. tra 2 numeri interi ? :asd:
http://utenti.quipo.it/base5/numeri/euclidalgor.htm
Converrai con me se ti dico che le "pappette scodellate" non sono utili a nessuno :sisi:
A presto ;)
 
Grazie per le risposte che purtroppo non sono servite a farmi arrivare alla soluzione, ho chiesto ad altri miei 2 collghi di incontrarci per provarci insieme, ma non ci siamo riusciti neanche insieme, neanche leggendo i vostri aiuti (siamo scarsoni ahaha) ho capito che ci sono 2 cicli for ma non ho capito cosa scrivere nel primo e nel secondo
Che non diventi un'abitudine:
ti posto una soluzione (funzionante) in C (se usi un altro linguaggio la sostanza non cambia) con le istruzioni commentate una per una; leggendo i commenti alle istruzioni ritroverai quello che ti è stato detto a parole.
Il cuore del listato è il doppio ciclo for che troverai all'interno (sono 4-5 righe), tutto il resto è un "di più" che serve a considerare i casi banali, mentre il while che vedi all'inizio serve solo a ripetere il calcolo più volte per fare le prove (non è necessario ai fini dell'esercizio),
ho considerato solo basi>=0 ed esponente>=0, ed ovviamente basi/esponenti interi.

Per capire come funziona ti sarebbe utile scrivere su un foglio di carta una tabella dove indichi i nomi delle variabili, quanto vale l'indice i e le somme parziali (in pratica esegui su un foglio una riga sotto l'altra quello che fa il programma); per esempio prova con 3^4.

Quanto osservato da gronag è corretto: si può ricorrere alle funzioni esponenziali ma in questo caso non potevamo farlo essendo l'esercizio sui cicli;
in Pascal si faceva in questo modo (in Pascal standard non c'era una funzione predefinita per l'elevazione a potenza...)

C:
#include <stdio.h>

int main(void){
   printf("\n***** INIZIO PROGRAMMA *****");
   int k, n, p; // calcolare k^n memorizzando il risultato in p
   int test = 1; // serve per ripetere il calcolo
   while(test != 0){
        printf("\n----------------------------------------------------");
        printf("\nInserisci il numero di cui calcolare la potenza --> ");
        scanf("%d", &k);
        printf("\nInserisci la potenza intera --> ");
        scanf("%d", &n);
        if( n==0 ){ // esponente =0
            if(k==0) printf("\n0^0 = forma indeterminata\n"); // 0^0 forma indeterminata
            else printf("\n%d^0 = 1\n", k); // k^0=1 per ogni k diverso da zero
        }
        else if(k==0) printf("\n0^%d = 0\n", n); // 0^n=0, inutile fare calcoli
        else if(k==1) printf("\n1^%d = 1\n", n); // 1^n=1, inutile fare calcoli
        else {
            int temp = k; // variabile temporanea
            p = temp;
            for(int i=1; i<n; i++){
                for(int j=1; j<k; j++)
                    p += temp;
                temp = p;
            }
            printf("\n%d^%d = %d\n", k, n, p);
        }
        printf("\nAncora? (0=NO, diverso da 0 = SI) --> ");
        scanf("%d", &test);
    }
    printf("\n***** FINE PROGRAMMA *****\n");
    printf("\nPremi un tasto per terminare");
    getchar();
    return 0;
}
 
Ultima modifica:
Che non diventi un'abitudine:
ti posto una soluzione (funzionante) in C (se usi un altro linguaggio la sostanza non cambia) con le istruzioni commentate una per una; leggendo i commenti alle istruzioni ritroverai quello che ti è stato detto a parole.
Il cuore del listato è il doppio ciclo for che troverai all'interno (sono 4-5 righe), tutto il resto è un "di più" che serve a considerare i casi banali, mentre il while che vedi all'inizio serve solo a ripetere il calcolo più volte per fare le prove (non è necessario ai fini dell'esercizio),
ho considerato solo basi>=0 ed esponente>=0, ed ovviamente basi/esponenti interi.

Per capire come funziona ti sarebbe utile scrivere su un foglio di carta una tabella dove indichi i nomi delle variabili, quanto vale l'indice i e le somme parziali (in pratica esegui su un foglio una riga sotto l'altra quello che fa il programma); per esempio prova con 3^4.

Quanto osservato da gronag è corretto: si può ricorrere alle funzioni esponenziali ma in questo caso non potevamo farlo essendo l'esercizio sui cicli;
in Pascal si faceva in questo modo (in Pascal standard non c'era una funzione predefinita per l'elevazione a potenza...)

C:
#include <stdio.h>

int main(void){
   printf("\n***** INIZIO PROGRAMMA *****");
   int k, n, p; // calcolare k^n memorizzando il risultato in p
   int test = 1; // serve per ripetere il calcolo
   while(test != 0){
        printf("\n----------------------------------------------------");
        printf("\nInserisci il numero di cui calcolare la potenza --> ");
        scanf("%d", &k);
        printf("\nInserisci la potenza intera --> ");
        scanf("%d", &n);
        if( n==0 ){ // esponente =0
            if(k==0) printf("\n0^0 = forma indeterminata\n"); // 0^0 forma indeterminata
            else printf("\n%d^0 = 1\n", k); // k^0=1 per ogni k diverso da zero
        }
        else if(k==0) printf("\n0^%d = 0\n", n); // 0^n=0, inutile fare calcoli
        else if(k==1) printf("\n1^%d = 1\n", n); // 1^n=1, inutile fare calcoli
        else {
            int temp = k; // variabile temporanea
            p = temp;
            for(int i=1; i<n; i++){
                for(int j=1; j<k; j++)
                    p += temp;
                temp = p;
            }
            printf("\n%d^%d = %d\n", k, n, p);
        }
        printf("\nAncora? (0=NO, diverso da 0 = SI) --> ");
        scanf("%d", &test);
    }
    printf("\n***** FINE PROGRAMMA *****\n");
    printf("\nPremi un tasto per terminare");
    getchar();
    return 0;
}
Mi pareva di averlo già postato più volte

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Mi pareva di averlo già postato più volte
gli ho postato l'intero main in C così che sia direttamente compilabile (e con commenti per aiutarlo di più) e coi calcoletti che non gli modificano l'input.
Ma se non fa le prove su carta che gli ho suggerito rischia di non capire ugualmente come funziona.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top