Algoritmo

Stato
Discussione chiusa ad ulteriori risposte.

rctimelines

Utente Èlite
5,144
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
no... hai reso complicato anche quello! ...come ai colloqui
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu

rctimelines

Utente Èlite
5,144
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
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.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
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
 

rctimelines

Utente Èlite
5,144
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
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 :)
 
  • Mi piace
Reazioni: Hobet

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
@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:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
@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:
 

raikoug

Nuovo Utente
23
2
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!!)
 
  • Mi piace
Reazioni: rctimelines

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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'è)
 

rctimelines

Utente Èlite
5,144
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
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
 

rctimelines

Utente Èlite
5,144
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
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
 

VidRam

Utente Èlite
1,880
342
CPU
AMD Ryzen 5 3500X
Dissipatore
DeepCool Gammaxx 400V2 Blue Ed.
Scheda Madre
Gigabyte b550 DS3H rev 1.0
HDD
NVME Intel 600p 512GB
RAM
2x8GB DDR4 Crucial Ballistix èlite 3200mhz
GPU
Nvidia Geforce RTX 2060 6GB Manli
Audio
Asus Xonar AE
Monitor
AOC G2460V 75hz 1ms + Benq FP 17"
PSU
Evga 500w 80plus white
Case
Golden Field P3
Periferiche
Logitech G413 Red Carbon/ Mionix Avior 7000 / Sennheiser GSP350.
Net
Fibra in rame 100 mb\s
OS
Windows 10 Pro 64bit
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:
 
  • Mi piace
Reazioni: Utente 16812

V&N0M

Nuovo Utente
130
29
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
 

V&N0M

Nuovo Utente
130
29
?!?!?
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
 

rctimelines

Utente Èlite
5,144
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
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
 
  • Mi piace
Reazioni: Utente 16812
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili