Algoritmo

Stato
Discussione chiusa ad ulteriori risposte.

V&N0M

Nuovo Utente
130
29
Buonasera qualcuno puo' darmi uno spunto per riuscire a risolvere questo algoritmo? #dato in input un numero intero e la sua potenza stampare il risultato ma senza usare la moltiplicazione
 
  • Mi piace
Reazioni: ClaudioIF

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
Buonasera qualcuno puo' darmi uno spunto per riuscire a risolvere questo algoritmo? #dato in input un numero intero e la sua potenza stampare il risultato ma senza usare la moltiplicazione
Annida un numero di cicli pari alla potenza di somme del numero

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Ultima modifica:

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
detta così sembra che prima di scrivere il programma devi conoscere l'input...
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
 
U

Utente 16812

Ospite
Buonasera qualcuno puo' darmi uno spunto per riuscire a risolvere questo algoritmo? #dato in input un numero intero e la sua potenza stampare il risultato ma senza usare la moltiplicazione

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

Utente 16812

Ospite
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

Sì :sisi:
 

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
Buonasera qualcuno puo' darmi uno spunto per riuscire a risolvere questo algoritmo? #dato in input un numero intero e la sua potenza stampare il risultato ma senza usare la moltiplicazione

Se vuoi qualcosa di elegante ed efficace, comunque ti consiglio di leggere ciò: https://en.wikipedia.org/wiki/Exponentiation_by_squaring

C:
int Moltiplicazione(int a, int b)
{
   int risultato=0;
   while(b != 0)              
   {
        if (b&01)               
        {
          risultato = 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;
}
 
Ultima modifica:

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

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
Ma se ha detto facendo la somma!?!!

Inviato dal mio Nexus 5 utilizzando Tapatalk
?!?!?
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;
}
 
Ultima modifica:

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
aazzz...

et voilà... python in 6/7 righe... i due cicli di cui sopra:

Python:
b = input("base=")
e = input("esponente=")

partial = 0
result  = int(b)

#QUESTO L'ALGORITMO. DA QUI...

for i in range(1, e):

    for j in range(0, int(b)):
        partial = partial + result

    result  = partial
    partial = 0

#...FINO A QUI

print(result)
 
Ultima modifica:

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
?!?!?
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;
}

mi pare che la fai un po' complicata per una sciocchezza del genere:


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;

}
 
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
mi pare che la fai un po' complicata per una sciocchezza del genere:


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;

}

È vero che è complicato inutilmente ma a mio parere accogliere queste sfide e renderle complicate è un ottimo modo per allenarsi e imparare oltre lo stretto necessario. Un esempio stupido può essere la proprietà commutativa tutti sanno cosa è ma pochi sanno dimostrare il perchè.
 

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
È vero che è complicato inutilmente ma a mio parere accogliere queste sfide e renderle complicate è un ottimo modo per allenarsi e imparare oltre lo stretto necessario. Cosa che fanno sempre ai colloqui, ti fanno fare cose base in modo complesso per vedere se hai una conoscenza approfondita.

girala come ti pare
 

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
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili