Algoritmo

Stato
Discussione chiusa ad ulteriori risposte.

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
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).
 
  • Mi piace
Reazioni: rctimelines
U

Utente 16812

Ospite
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 ;)
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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:
  • Mi piace
Reazioni: Utente 16812

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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 piace
Reazioni: Utente 16812

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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.
 
  • Mi piace
Reazioni: Utente 16812
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili