Algoritmo

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Da questo deduco che programmare non lo fai come lavoro.

da cosa lo dedurresti? Rendere le cose complicate è da programmatori professionisti? Io ho sempre cercato di semplificarle, mi sembra più indicativo di intelligenza che non renderle complesse... fin da quando dovevo far stare il codice in qualche kappa di ram... deduci male: programmo da oltre 30 anni e in alcune occasioni l'ho fatto per guadagnarmi da vivere.
 
da cosa lo dedurresti? Rendere le cose complicate è da programmatori professionisti? Io ho sempre cercato di semplificarle, mi sembra più indicativo di intelligenza che non renderle complesse... fin tda quando dovevo far stare il codice in qualche kappa di ram... deduci male: programmo da oltre 30 anni e in alcune occasioni l'ho fatto per guadagnarmi da vivere.
Ci sono facce e facce della medaglia, continui a parlare di cose complesse, nessuno a complicato niente non è stato scritto nessun tipo di codice inutile tutto quello che è stato scritto era essenziale fino all' osso, è stato solo fatto vedere come tutto ciò si può fare operando solo nel campo dei bit e si chiama curiosità è quella che fa evolvere l uomo, limitarsi sempre allo stretto necessario e non voler mai osare si chiama pigrizia. Era solo uno dei tanti modi per dimostrare come la cosa si poteva fare, tu lo hai dimostrato in Python io in C con i bitwise visto la facilità dell'esercizio tutto qui. In campo reale ovvio che non si useranno mai metodi complessi come questi, ma qui stiamo su un forum dove scambiamo opinioni e pareri smettila di far finta di non capire
 
Ci sono facce e facce della medaglia, continui a parlare di cose complesse, nessuno a complicato niente non è stato scritto nessun tipo di codice inutile tutto quello che è stato scritto era essenziale fino all' osso, è stato solo fatto vedere come tutto ciò si può fare operando solo nel campo dei bit e si chiama curiosità è quella che fa evolvere l uomo, limitarsi sempre allo stretto necessario e non voler mai osare si chiama pigrizia. Era solo uno dei tanti modi per dimostrare come la cosa si poteva fare, tu lo hai dimostrato in Python io in C con i bitwise visto la facilità dell'esercizio tutto qui. In campo reale ovvio che non si useranno mai metodi complessi come questi, ma qui stiamo su un forum dove scambiamo opinioni e pareri smettila di far finta di non capire

vabbeh dai, non prendertela tanto... comunque siamo OT, quindi meglio chiudere qui.

Siamo su un forum in cui la richiesta è stata fatta da un utente inesperto a cui il professore ha posto la domanda: già scrivere del codice, secondo me è una scelta sbagliata. Io l'ho fatto solo in risposta alla tua precedente, prima mi ero limitato a descrivere come poteva essere risolto... e pare inoltre che, proprio grazie a quello spunto, un altro utente ( @gronag ) abbia capito perfettamente che cosa intendevo.

Ho capito cosa intendevi e infatti ti ho risposto: girala come ti pare! ... per me la questione non va oltre, ciao :)
 
@Rand ≠ Rand
Data la natura dell'esercizio, che si suppone per principianti, è inutile tirar fuori codice assembler e operazioni sui bit;
è vero che non c'è mai un unico modo di fare le cose e che si trovano sempre metodi più efficienti di altri.
Ma chi ha aperto il topic sta cominciando adesso ad affacciarsi alla programmazione, è evidente che l'esercizio è stato dato per fargli far pratica di cicli (eventualmente annidati).
Il codice che hai postato funziona in C, è intraducibile un linguaggio che per valori booleani accetta false/true "puri" e non 0/diverso-da-zero in stile C/C++; inoltre l'algoritmo scritto così è incomprensibile.
Cosa peggiore di tutte, HAI BARATO perché hai violato le regole:
l'esercizio imponeva di NON usare la moltiplicazione, invece tu l'hai usata mascherata da funzione. Il metodo corretto è più banale con 2 for che mette in pratica il meccanismo di accumulazione delle somme (esplicitato pure da @gronag).
Perciò... sei bocciato, imbroglione! :lol: :lol: :lol:

P.S.
ed inoltre, supponendo che la base b sia diversa da zero, nessuno ha considerato che b^0=1 !!!
perciò manca almeno un if su tutti i codici in tutti i linguaggi con cui avete codificato :P
 
Ultima modifica:
@Rand ≠ Rand
Data la natura dell'esercizio, che si suppone per principianti, è inutile tirar fuori codice assembler e operazioni sui bit;
è vero che non c'è mai un unico modo di fare le cose e che si trovano sempre metodi più efficienti di altri.
Ma chi ha aperto il topic sta cominciando adesso ad affacciarsi alla programmazione, è evidente che l'esercizio è stato dato per fargli far pratica di cicli (eventualmente annidati).
Il codice che hai postato funziona in C, è intraducibile un linguaggio che per valori booleani accetta false/true "puri" e non 0/diverso-da-zero in stile C/C++; inoltre l'algoritmo scritto così è incomprensibile.
Cosa peggiore di tutte, HAI BARATO perché hai violato le regole:
l'esercizio imponeva di NON usare la moltiplicazione, invece tu l'hai usata mascherata da funzione. Il metodo corretto è più banale con 2 for che mette in pratica il meccanismo di accumulazione delle somme (esplicitato pure da @gronag).
Perciò... sei bocciato, imbroglione! :lol: :lol: :lol:

P.S.
ed inoltre, supponendo che la base b sia diversa da zero, nessuno ha considerato che b^0=1 !!!
perciò manca almeno un if su tutti i codici in tutti i linguaggi con cui avete codificato :P
:ops:
 
E spero che nessuno inizi il dibattito sul 0^0 o 0^x
Concordo con il fare esercizi base con "roba" base.
Giocare con i cicli e fare funzioni è diverso.
Tanto per gradire, ricordo che un collega all'università, uno sempre con 30 e lode a tutto, venne bocciato malamente ad un esame insignificante per un jump truffaldino che il professore non apprezzò!
(buttare l'asm nel C è poetico, per carità... ma.. dai!!)
 
E spero che nessuno inizi il dibattito sul 0^0 o 0^x
in realtà è un caso che va matematicamente considerato;
si può anche evitare di fare calcoli inutili sia per 0^n che per 1^n (per cuiriosità ho provato a calcolare con le sole somme 1 elevato a 1 miliardo...);
inoltre abbiamo arbitrariamente supposto che la base si un intero positivo (e se è negativa?)
in tutti questi casi si tratta solo di mettere qualche if in più, con il vantaggio di essere
- matematicamente migliore
- allenante per il principiante
secondo me l'unica cosa che si può trascurare in questo particolare esercizio è che, usando (per semplicità) interi int a 32 bit si può andare fuori range ed ottenere risultati sballati (allargare il brodo agli interi a 64 bit sposta più in là il limite, ma tant'è)
 
in realtà è un caso che va matematicamente considerato;
si può anche evitare di fare calcoli inutili sia per 0^n che per 1^n (per cuiriosità ho provato a calcolare con le sole somme 1 elevato a 1 miliardo...);
inoltre abbiamo arbitrariamente supposto che la base si un intero positivo (e se è negativa?)
in tutti questi casi si tratta solo di mettere qualche if in più, con il vantaggio di essere
- matematicamente migliore
- allenante per il principiante
secondo me l'unica cosa che si può trascurare in questo particolare esercizio è che, usando (per semplicità) interi int a 32 bit si può andare fuori range ed ottenere risultati sballati (allargare il brodo agli interi a 64 bit sposta più in là il limite, ma tant'è)
Più che altro direi che il quesito iniziale è stato sufficientemente risolto per quello che sottointendeva. Ora si sta soprattutto ampliando l'entità della questione in quanto matematicamente l'elevazione a potenza è per definizione risultato di prodotti e non di somme, quindi operazioni aritmetiche che hanno proprietà diverse.
La soluzione, ovviamente, sta nel porre una serie di condizioni che facciano fronte a queste differenze fondamentali.
Il problema dell' overflow invece, riguarda le possibilità fisiche del calcolatore e può essere risolto ricorrendo a una procedura che consideri la rappresentazione esponenziale del risultato (per esempio accantonando il parziale una volta raggiunto il limite della notazione a 64bit)

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Infatti, 0^n fa calcoli inutili ma il risultato è giusto, 1^n dà un risultato sbagliato; lo stesso per n^0, come già detto.
Per basi negative i risultati dovrebbero essere comunque corretti, il problema riguarda piuttosto l'esponente negativo!

In ogni caso stiamo facendo le pulci su una questione che non lo richiedeva.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
In ogni caso stiamo facendo le pulci su una questione che non lo richiedeva.

Inviato dal mio Nexus 5 utilizzando Tapatalk
Ecco infatti, è un semplice esercizio ed eviterei flame inutili se possibile, poi ovviamente la programmazione è bella perchè è varia ma cerchiamo di non criticare troppo le soluzioni altrui e rimaniamo in un contesto friendly :dancinghae::dancinghae:
 
Si, in effetti: sono due cicli in cui quello più interno viene ripetuto il numero pari all'elevazione sommando per un numero di volte pari alla base il risultato del ciclo precedente.. è così?

Inviato dal mio Nexus 5 utilizzando Tapatalk
Se ho capito bene, dati in input 2 numeri naturali, a (base) e n (esponente), devi stampare il risultato della potenza senza far uso della moltiplicazione, giusto ? :look:
Be', intanto puoi utilizzare i cicli (ad es. FOR) "nidificati": supponiamo che tu voglia calcolare 5^4, devi seguire il seguente procedimento:

1) addizioni 5 volte 5 (5+5+5+5+5=25), cioè 5^2;
2) addizioni 5 volte 25 (25+25+25+25+25=125), cioè 5^3;
3) addizioni 5 volte 125 (125+125+125+125+125=625), cioè 5^4 :asd:

Ciao ;)
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
 
?!?!?
E quale è il problema due minuti e si aggiusta tutto una mia svista.:ops:
Per sfida ho creato anche l'addizione.@Sinatrap Un mio consiglio in esercizi come questi e di non rendere tutto il problema un unico problema ma fare come ho fatto io, ricrearti la moltiplicazione con un funzione e poi ricrearti la funzione potenza apparte. Separa il problema in altri piccoli problemi risolvibili, a lungo andare quando incontrerai un bug sarà più facile da gestire ed il main cerca di lasciarlo il più pulito possibile.
C:
#include <stdio.h>

 int main(){
        printf("%d", potenza(2,3));
    return 0;
 }


unsigned addizione(unsigned a, unsigned b)
{
    unsigned c = 0;
   __asm__ ("movl %2, %%eax\n\t"
                    "addl %1, %%eax\n\t"
                    "movl %%eax, %0\n\t"
                    :"=r"(c)
                    :"r"(a),"r"(b)
                    :"%eax"
             );
    return c;
}

// OPPURE
/**
 int addizione(int a, int b) {
        if(b == 0)
            return a;

        return addizione( a ^ b, (a & b) << 1);
    }
**/

 int Moltiplicazione(int a, int b)
{
   int risultato=0;
   while(b != 0)   
   {
        if (b&01)     
        {
          risultato = addizione(risultato, a); //risultato+a;
        }
        a<<=1;         
               
        b>>=1;         
   }
    return risultato;
}

int potenza(int base, int esponente)
{
    int risultato = 1;
    while (esponente)
    {
        if (esponente & 1)
                risultato =Moltiplicazione(risultato,base);
           // risultato *= base;
        esponente >>= 1;
       base = Moltiplicazione(base,base);
       // base *= base;
    }

    return risultato;
}
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
 
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 codice è questo:

C:
parziale   = 0;
risultato  = base;

for (int i=1; i<esponente; i++) {
 
   for(int j=0; j<base; j++){ parziale += risultato }
 
   risultato = parziale;
   parziale  = 0;

}

Se vuoi puoi cambiare il ciclo esterno con un while:

C:
parziale   = 0;
risultato  = base;

while (esponente > 0) {
 
   for(int j=0; j<base; j++){ parziale += risultato }
 
   risultato = parziale;
   parziale  = 0;
   esponente--;

}

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top