Annida un numero di cicli pari alla potenza di somme del numeroBuonasera 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
detta così sembra che prima di scrivere il programma devi conoscere l'input...Annida un numero di cicli pari alla potenza di somme del numero
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ì?detta così sembra che prima di scrivere il programma devi conoscere l'input...
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
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
Annida un numero di cicli pari alla potenza di somme del numero
Inviato dal mio Nexus 5 utilizzando Tapatalk
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
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;
}
Ma se ha detto facendo la somma!?!!Se vuoi qualcosa di elegante ed efficace, comunque ti consiglio di leggere ciò: https://en.wikipedia.org/wiki/Exponentiation_by_squaring
C:int potenza(int base, int esponente) { int risultato = 1; while (esponente) { if (esponente & 1) risultato *= base; esponente >>= 1; base *= base; } return risultato; }
?!?!?Ma se ha detto facendo la somma!?!!
Inviato dal mio Nexus 5 utilizzando Tapatalk
#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;
}
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)
?!?!?
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; }
parziale = 0;
risultato = base;
for (int i=1; i<esponente; i++) {
for(int j=0; j<base; j++){ parziale += risultato }
risultato = parziale;
parziale = 0;
}
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. Cosa che fanno sempre ai colloqui, ti fanno fare cose base in modo complesso per vedere se hai una conoscenza approfondita.
Penso che non hai chiaro il concetto che volevo esprimere, ma va bè :patpat:girala come ti pare